2016-03-22 6 views
11

はなぜjava.text.DecimalFormatは、以下の結果を評価しない:DecimalFormat "。#"と "0.#"は23.0で異なる結果を表示するのはなぜですか?

new DecimalFormat("0.#").format(23.0)  // result: "23" 

new DecimalFormat(".#").format(23.0)   // result: "23.0" 

特殊文字#はゼロを省略しているため、私は、結果は両方のケースで23であることを期待しました。先頭の特殊文字0は小数部分にどのように影響しますか?

+0

''。# "'は有効なフォーマットで、 '#。# 'でなければならないのだろうと思っています。その結果も' 23'となります。 – Tom

+0

@Tom:DecimalFormat( "。0")も機能します。 javadocで "。#"のようなものを禁止するものは見ませんでした。 – MGn

+0

* "javadocの中で" "*私のどちらでもないようなものは禁止されていますが、コードがこれを正しく処理できるわけではありません。また、 '。#'や '.0'が無効で、" fallback "は数字を出力するだけで、同じ文字列(' '23.0 '')になるので' 'DecimalFormat ')。しかし、再び、それはちょうど推測です。 – Tom

答えて

7

JavaDocでは2番目の形式が無効であるようですが、何とかエラーが発生しても解析されません。この場合

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のバージョン間やライブラリ実装間で変更される可能性があるため、実際にはそれに頼るべきではありません。

3

次のソースコメントは、".#"のやや直感的ではない操作について説明しています。私DecimalFormat.javaファイル(JDK 8)内の行3383から3385には、次のコメントがあります。開発者は、代わりにあなたが("0.#")期待したもので、".0##"として".#"を解釈することを選択したよう

// Handle patterns with no '0' pattern character. These patterns 
// are legal, but must be interpreted. "##.###" -> "#0.###". 
// ".###" -> ".0##". 

は思えます。

+0

私はDecimalFormatのソースコードを見て、これを見ていました。 – callyalater

+0

私はすでに私の答えでそれを文書化しましたが、私はあなたに異なる行番号を持っています。その不一致の原因は何か?ここで参照しているJavaのバージョンについては言及していません。責任を負う可能性があるため、明確にするためにそれを追加できますか? –

+0

私はJDK 8を使用していますが、それは違いです。 – MicSim

関連する問題