当我们使用DecimalFormat方法时,为什么模式“33333。##”行为如此奇怪.format()?

时间:2017-09-30 10:01:07

标签: java formatting decimalformat

昨天我试图自己探索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”? 我真的不知道如何解释这种行为。

1 个答案:

答案 0 :(得分:0)

documentation突出显示您应该设置的模式的清晰语法。您的两种格式都违反了所需的语法,因此您的发现不应被视为可靠,并且可能会在将来的版本中发生变化。坦率地说,我很惊讶构造函数不会以这些格式抛出异常。

33332.##33332被视为前缀,余下的.##无效,因为0#是在小数点之前需要。

33033.##33被视为前缀,留下033.##。鉴于0.#不能成为任何前缀或后缀的一部分,并且3只能是前缀或后缀的一部分,此模式无效。< / p>