Java DecimalFormat中#与0的差异及格式异常问题咨询
DecimalFormat格式模式疑问解答
测试代码
public class Main { public static void main(String[] args) { String pattern = ".00"; // a) => |.46| // String pattern = ".##"; // b) => |.46| // String pattern = ".0#"; // c) => |.46| // String pattern = "#.00"; // d) => |.46| // String pattern = "#.0#"; // e) => |.46| // String pattern = "#.##"; // f) => |0.46| // String pattern = ".#0"; // g) => IllegalArgumentException: Malformed pattern ".#0" double value = 0.456; DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.US); df.applyPattern(pattern); String output = df.format(value); System.out.printf("|%s|", output); } }
问题1:为什么#.##显示小数点前的0,#.00和#.0#却不显示?
这是DecimalFormat针对小数部分位数类型的不同处理逻辑:
- 当小数部分是
##时,属于可选位数(最多保留两位,没有数字就不显示),DecimalFormat会默认开启“整数部分无有效数字时补0”的规则,目的是让整数和小数的格式保持统一(比如1.23和0.46都有整数位); - 当小数部分是
00或0#时,属于强制至少一位小数的模式,DecimalFormat会判定这是专门用于格式化纯小数的场景,此时整数位的#(代表“有数字才显示,没有就空着”)会被直接忽略,所以不会补0。
问题2:模式.#0为什么抛出IllegalArgumentException?
因为DecimalFormat的小数部分模式有严格的顺序要求:必须把强制位0放在左侧,可选位#放在右侧,不能反过来。
0是强制显示的数字位,要求对应位置必须有数字;#是可选显示的数字位,没有数字就空着。如果写成.#0,相当于让DecimalFormat先处理可选位再处理强制位,这会导致数字位的位置逻辑混乱,系统直接判定为无效模式,抛出异常。
内容的提问来源于stack exchange,提问作者Sy Pham
相关产品推荐
相关产品推荐

