2013-09-25 149 views
0

不同的行爲我看到奇怪的行爲,當我使用Java的DecimalFormatter與不同的區域設置。如果數字是1,255,000,000的值(在調試器中顯示爲1.255E9),那麼我將它傳遞給帶有Locale的DecimalFormatter。Java DecimalFormatter - 區域設置DE和區域設置US

如果語言環境設置爲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%>"> 
+0

請問您可以發佈一個可重複使用的小例子嗎? –

+0

你正在使用什麼'DecimalFormatter'方法?我想我會期望一個'ParseException'或者「1.255」,這取決於方法,因爲在DE中,「,」是一個小數點,並且你不希望數字中有兩個小數點。 (新的Locale(「DE」))。parse(「1,255,000,000」)'返回'1.255',如預期的那樣,因爲'','== NumberFormat.getInstance(new Locale(「DE 「))。getDecimalFormatSymbols()。getDecimalSeparator()'。) – Jeremy

回答

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

+0

這是如何解釋OP注意到的'1.255E13'的? –

+0

目前還不清楚「1.255E13」結果可以被複制。 OP還沒有提到的其他事情正在發生。 –

+0

爲了更加清晰,我編輯了這個問題。被解析的字符串是「1.255E9」。 – bluedevil2k