2

私はDecimalFormatで最も奇妙なことをしています。

Webアプリケーションで使用しています。私はいくつかのテストをセットアップしました、そしてそれは私と一緒にローカルで失敗し続けます。私の友人がそれを実行し、彼はJUnitテストを正常に実行することができました。

奇妙な部分は、私たちのサーバーでは、アプリケーションが問題なく完全に実行することです。

Javaは、バリュタや数値設定などのシステム設定に依存している可能性がありますか?それとも別の理由がありますか?これが私のコードのように見えます:

public String generateFormatPrice(double price) throws Exception {
    DecimalFormat format1 = new DecimalFormat("#,##0.00");
    String tmp = format1.format(price).replace(".", "&");
    String[] tmps = tmp.split("&");
    return tmps[0].replace(',', '.') + "," + tmps[1];
}

よろしくお願いします!

4

1 に答える 1

8

このコードは確かにロケール固有です。コードが米国などのロケールに依存している場合は、「。」は小数点記号、「、」は千単位の区切り文字です。このコードを、たとえばドイツ語ロケールに設定されたサーバーで実行すると、失敗します。

このコンストラクターの使用を検討してください。これにより、使用しているシンボルを明示的に指定できます。

編集:私が知る限り、「。」を使用して数値をフォーマットしようとしています。千単位の区切り文字として、「、」は小数点記号として。つまり、フランスとドイツで使用されている形式です。これを実現する1つのアプローチは次のとおりです。

public static String generateFormatPrice(double price) {
    final NumberFormat format = NumberFormat.getNumberInstance(Locale.GERMANY);
    format.setMinimumFractionDigits(2);
    format.setMaximumFractionDigits(2);
    return format.format(price);
}

また、金銭的価値を保持するためにdoubleを使用するべきではありません。そうすると、厄介なバグが発生する可能性があります。

于 2012-01-05T13:24:03.620 に答える