2012-01-05 59 views
2

我有一个DecimalFormat奇怪的事情。DecimalFormat取决于系统设置?

我在web应用程序中使用它。 我设置了一些测试,并保持与本地失败。 我的一个朋友跑了它,他能够成功地运行JUnit测试。

奇怪的是,在我们的服务器上,应用程序完全运行它,没有任何问题。

难道是Java依赖于系统设置像valuta和数字设置? 或者还有其他原因吗? 这是我的一段代码的样子:

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]; 
} 

非常感谢提前!

+2

它可能是语言环境? – mre 2012-01-05 12:43:17

+1

[DecimalFormat]的Javadocs的第一句(http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html)提到语言环境。另外,失败的单元测试的代码在哪里? – 2012-01-05 12:45:39

+0

这可能是一个好主意,说明如何测试失败。是否生成异常?如果是这样,什么例外?输出是否与您期望的不同,导致JUnit断言失败?如果是这样,你会得到什么输出和你期望的输出? – Alderath 2012-01-05 13:14:45

回答

6

此代码确实是特定于语言环境的。如果您的代码依赖于位于美国等地区的“。”。是小数点分隔符,“,”是千位分隔符,然后在设置为例如德语区域设置的服务器上运行此代码时,它将失败。

考虑使用constructor,它允许您明确指定您正在使用哪些符号。

编辑:据我可以告诉你试图格式化数字使用“。”作为千位分隔符和“,”作为小数分隔符。换句话说,法国和德国使用的格式。这里有一个方法,将实现这一点:

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

而且,你不应该使用双持有货币价值 - 你会如果你这样做会遇到一些讨厌的错误。