2012-01-05 61 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); 
} 

而且,你不應該使用雙持有貨幣價值 - 你會如果你這樣做會遇到一些討厭的錯誤。