2011-12-19 3 views
3

double文字列フォーマットで遊んでいる間、私は、少なくとも私のロケールに、デフォルトDecimalFormatオブジェクトによって生成される文字列は、それがInfinityNaNのような特殊なケースになるとDouble.toString()によって生成されたものとは異なっている、ということに気づきました。例えば。このスニペットから:DecimalFormatに特殊記号の代わりにASCII文字列を表示するにはどうすればよいですか?

for (double i : new double[]{ 1/0.0, -1/0.0, 0/0.0 }) { 
    System.out.println(Double.toString(i)); 
    System.out.println(new DecimalFormat().format(i)); 
} 

私はこの出力を得る:

Infinity 
∞ 
-Infinity 
-∞ 
NaN 
� 

これはNaNInfinityのために見ている既存のコードに問題が発生していないだけではなく、最後の記号は上のフォントと読めません私の開発システム。私が数値を調べる限り、最後の記号はU+FFFDのUnicode置換文字です。これは実際に意味のあるものに実際に設定されていないことを意味します。

私のアプリケーションのいくつかのために、私は7ビットのASCII表現を好むので(「あなたが受け入れるものにリベラルてあなたが作るものの中に保守的」)、DecimalFormatにによって生成文字列を強制的にいくつかの方法がありますDouble.toString()で生成されたものと一致しますか?

私の場合、DecimalFormatSymbolsを提供するのが1つの方法かもしれませんが、関連するすべてのフィールドを自分で設定する必要があるようですが、やや壊れやすいと思います。それを避ける方法はありますか?

答えて

2

残念ながら、DecimalFormatSymbolsクラスを使用して変更する唯一の方法です。

http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

あなたのDecimalFormatからDecimalFormatSymbolsオブジェクトを取得し、それを変更することができます。以下のコードスニペットを参照してください。したがって、すべてのフィールドを設定する必要はありません。

DecimalFormat df = new DecimalFormat(); 
DecimalFormatSymbols dfs = df.getDecimalFormatSymbols(); 
dfs.setNaN("NaN"); 
df.setDecimalFormatSymbols(dfs); 
+0

これは、実際の答えのようですので、私はそれがあるとしてがっかり、この答えを受け入れるだろう... – thkala

+0

'getDecimalFormatSymbols'ので、それはのシンボルを変更することはありません修正、内部オブジェクトのコピーを返します。既存のDecimalFormatオブジェクト'setDecimalFormatSymbols'を呼び出すか、DecimalFormatコンストラクタでDecimalFormatSymbolsオブジェクトを渡す必要があります。 – Mikkel

+0

@Mikkelが指摘したように、追加の命令がありません: 'df.setDecimalFormatSymbols(dfs);' – jcfrei

関連する問題