0

当我将 Java 的 DecimalFormatter 与不同的语言环境一起使用时,我看到了奇怪的行为。如果该数字是双精度值,值为 1,255,000,000(在调试器中显示为 1.255E9),我将其传递给具有区域设置的 DecimalFormatter。

如果 Locale 设置为 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());
}

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

于 2013-09-25T01:34:21.843 回答