为什么 java.text.DecimalFormat
评估以下结果:
new DecimalFormat("0.#").format(23.0) // result: "23"
new DecimalFormat(".#").format(23.0) // result: "23.0"
我本来期待结果 23
在这两种情况下,因为特殊的性格 #
省略零。领导特殊角色如何? 0
影响分数部分? (尝试将其与javadoc中给出的BNF匹配/理解,但未能这样做。)
第二种格式似乎无效 的JavaDoc,但无论如何它无错误地解析。
Pattern:
PositivePattern
PositivePattern ; NegativePattern
PositivePattern:
Prefixopt Number Suffixopt
NegativePattern:
Prefixopt Number Suffixopt
Prefix:
any Unicode characters except \uFFFE, \uFFFF, and special characters
Suffix:
any Unicode characters except \uFFFE, \uFFFF, and special characters
Number:
Integer Exponentopt
Integer . Fraction Exponentopt
Integer:
MinimumInteger
#
# Integer
# , Integer
MinimumInteger:
0
0 MinimumInteger
0 , MinimumInteger
Fraction:
MinimumFractionopt OptionalFractionopt
MinimumFraction:
0 MinimumFractionopt
OptionalFraction:
# OptionalFractionopt
Exponent:
E MinimumExponent
MinimumExponent:
0 MinimumExponentopt
在这种情况下,我希望格式化程序的行为是未定义的。也就是说,它可能产生任何旧的东西,我们不能依赖于任何方式的一致性或有意义。所以,我不知道你为什么得到23.0,但是你可以认为在代码中你应该避免这是无稽之谈。
更新:
我刚刚通过Java 7的DecimalFormat库运行调试器。代码不仅明确地说'。#'是允许的,那里有一个注释(java.text.DecimalFormat:2582-2593),它表示允许它,以及一个允许它的实现(第2597行)。这似乎违反了该模式记录的BNF。
鉴于这不是记录在案的行为,你真的不应该依赖它,因为它可能会在Java版本甚至库实现之间发生变化。
以下源评论解释了相当不直观的处理 ".#"
。在我的行中3383-3385行 DecimalFormat.java
file(JDK 8)有以下注释:
// Handle patterns with no '0' pattern character. These patterns
// are legal, but must be interpreted. "##.###" -> "#0.###".
// ".###" -> ".0##".
似乎开发人员已经选择解释 ".#"
如 ".0##"
而不是你的预期("0.#"
)。