0

Java の DecimalFormatter を異なるロケールで使用すると、奇妙な動作が見られます。数値が値 1,255,000,000 (デバッガーでは 1.255E9 と表示されます) を持つ double の場合、Locale を使用して DecimalFormatter に渡します。

ロケールが de|DE に設定されている場合、数値は 1.255E13 に変換されます。

ロケールが en|US に設定されている場合、数値は (正しく) 1.255E9 に変換されます。

ドイツ語のロケールが間違っているのはなぜですか?

これが私のコードです...

// number comes from JSP
// usually in form of "1.255E9"
String text = request.parameter("number");
NumberFormat numFormatter = NumberFormat.getInstance(formatLocale); 
DecimalFormat formatter = (DecimalFormatter)numFormatter;
formatter.applyPattern("#,###");
return formatter.parse(text.trim()).doubleValue();

**より明確にするために編集**

サーバー側のコードに渡される文字列は、上で概説したとおり、「1.255E9」です。JSPページでは、HTMLのように単純にやっています

<input type="hidden" name="number" value="<%=price%>">
4

1 に答える 1

2

一部のヨーロッパの国 (ドイツを含む) では,、小数点記号および.グループ区切り記号 (千単位の区切り記号) として使用されます。したがって、同じ数値で12345.678も異なる表現を持つことができます。

12,345.678 (US)
12.345,678 (Germany)

次のように、小数点記号とグループ化記号を確認できます。

Locale[] locales = Locale.getAvailableLocales();
for(Locale l : locales) {
  DecimalFormatSymbols s = ((DecimalFormat)DecimalFormat.getInstance(l))
    .getDecimalFormatSymbols();
  System.out.printf("%s:\t%s\t%s\n",
    l.getDisplayCountry(),
    s.getGroupingSeparator(),
    s.getDecimalSeparator());
}

このため、文字列はUS ロケールで1,255,000,000解析され、DE (ドイツ) ロケールで解析されます。12550000001.255

于 2013-09-25T01:34:21.843 に答える