2017-09-30 5 views
1

昨日、DecimalFormatメソッド.format()のすべてのプレースホルダとその振る舞いを自分自身で調べようとしました。
私は2つの数字を書いて、それらに異なるパターンを試しました。 "#。##"を使用すると、有意でないすべてのゼロが切り捨てられ、 "0000.00"の場合、このメソッドは数値の先頭にゼロを追加しました。それは問題ありませんでしたが、何が起こるかを見るためにいくつかの奇妙なパターンを試しました。
"33333。##"というパターンでは、最終的な出力は本当に奇妙でした。あなたは以下の私のコードを見ることができる:DecimalFormatメソッド.format()を使用するとパターン "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 
-2,0 

に同じ入力を数値としてではなく使用済みのパターンで結果を与えた "33033 ##。":

33222,4732 
33102 

私はプログラムが0の代わりにフォーマットされた数字を追​​加したが、なぜゼロがプレースホルダーとして提示されないと、メソッドはまだ最初と(明らかに)2番目の数字を丸めるのだろうか?
なぜ私の最初の数字は2番目の数字に丸められていなければならなかったのですが、2番目の数字(b)は最後に0が印刷されていましたか?
なぜ、0プレースホルダが "33033。##"の真中に表示されると、プログラムはフォーマットされた番号aをその場所に挿入しますが、番号bの最後に "33"
私は本当にこの動作を説明する方法を知らない。

答えて

0

documentationは、設定するパターンの明確な構文を強調表示します。両方のフォーマットが必要な構文に反するので、結果は信頼できると見なされるべきではなく、将来のバージョンで変更される可能性があります。率直に言って、私はコンストラクタがこれらの形式で例外をスローしないことに驚いています。

33332.##33332は接頭辞として見られ、いずれか0又は#は、小数点の前に必要とされる残り、.##は、有効ではありません。

33033.##33は接頭辞として表示され、033.##のままです。 0の場合、.でも#も接頭辞または接尾辞の一部ではなく、3は接頭辞または接尾辞の一部でなければなりません。このパターンは無効です。

+0

ええ、私はそれらが無効であることを知っていますが、それはすべてのパターンが番号bとは異なる方法で番号aを扱う理由を説明していません。例題を見てください - パターン "33332。##"は小数点記号の後の2桁目に "a"を書いていますが、 "b"は最初のものに書式化されています。 –

+0

私が言っていることは、それが無効であるため結果が予測できないということです。これにはいくつかの理由がありますが、警告なく変更されることはないと信じる理由はありません。 –

関連する問題