Java DecimalFormat - Locale DEmand Locale US之间的不同行为

时间:2013-09-25 01:02:48

标签: java decimalformat

当我使用Java的DecimalFormatter和不同的Locales时,我看到了奇怪的行为。如果数字是一个双重值1,255,000,000(在调试器中,它显示为1.255E9),我将它传递给带有Locale的DecimalFormatter。

如果Locale设置为de | DE,则将数字转换为1.255E13。

如果Locale设置为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%>">

1 个答案:

答案 0 :(得分: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());
}

由于这个原因,字符串1,255,000,000在美国语言环境中解析为1255000000,在DE(德国)语言环境中解析为1.255