DecimalFormat在其他机器上的工作方式不同

时间:2015-12-24 16:35:49

标签: java

我已经创建了一个java应用程序,我使用DecimalFormat来格式化数字的输出。

DecimalFormat df = new DecimalFormat("#.##");      
return Double.parseDouble(df.format(costs));

它在我的计算机上工作正常,但是当这个代码在另一台机器上执行时, 我收到这个错误:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "25,1"
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)

两台机器都安装了最新的java版本,两者都是Windows 7.一台机器是64位,而另一台机器是32位。只有在另一台机器上发生错误的原因是什么?

2 个答案:

答案 0 :(得分:5)

区域设置,一句话。一台机器是欧洲格式,#,#,另一台是美国/英国,#.#

编辑: 使用DecimalFormat对象向两个方向传播:df.parse(...)解析由df.format创建的字符串。

答案 1 :(得分:2)

df.format(25.1)根据默认或指定的区域设置返回格式化的数字String

对于Locale.US

它将返回String 25.1,而在Locale.ITALY的情况下,它将返回25,1作为十进制分隔符两种语言环境都不同。

另一个问题是您正在解析格式化的Stringdouble。如果您有double值(或其他有效数字),则无需使用DecimalFormat格式化数字。

如果您使用有效号码String25.1),则可以通过以下方式使用DecimalFormatter对其进行解析,

NumberFormat nf = NumberFormat.getNumberInstance(Locale.ITALY);
DecimalFormat df = (DecimalFormat) nf;
df.applyPattern("#.##");
try {
    System.out.println(df.parse("25,1"));
} catch (ParseException e) {
    e.printStackTrace();
}

<强>输出

25.1