昨天我试图自己探索DecimalFormat方法.format()及其所有占位符及其作用的行为。
所以我写了两个数字并尝试了不同的模式。使用“#。##”,所有非重要零都被剪切,并且使用“0000.00”,该方法在数字前面添加前导零。那没关系,但后来我尝试了一些奇怪的模式,看看会发生什么
使用模式“33333。##”,最终输出真的很奇怪。您可以在下面看到我的代码:
DecimalFormat df = new DecimalFormat("33332.##");
double a= 222.46705219;
double b=-102.000;
System.out.println(df.format(a));
System.out.println(df.format(b));
它的输出是:
33332222,47
-33332102,0
与数字相同的输入,但使用的模式“33033。##”给出结果:
33222,4732
33102
据我所知,该程序在0的位置添加了格式化的数字,但为什么当零没有作为占位符呈现时,该方法仍然围绕第一个和(显然)第二个数字?
为什么我的第一个数字是四舍五入到第二个数字,但第二个数字(b)在末尾打印为零?
为什么当0-placeholder出现在“33033。##”的中间时程序在其位置插入格式化的数字a,但在数字b的末尾不打印“33”?
我真的不知道如何解释这种行为。
答案 0 :(得分:0)
documentation突出显示您应该设置的模式的清晰语法。您的两种格式都违反了所需的语法,因此您的发现不应被视为可靠,并且可能会在将来的版本中发生变化。坦率地说,我很惊讶构造函数不会以这些格式抛出异常。
33332.##
:33332
被视为前缀,余下的.##
无效,因为0
或#
是在小数点之前需要。
33033.##
:33
被视为前缀,留下033.##
。鉴于0
,.
和#
不能成为任何前缀或后缀的一部分,并且3
只能是前缀或后缀的一部分,此模式无效。< / p>