2013-09-25 2 views
0

Я вижу странное поведение, когда я использую DecimalFormatter Java с разными языками. Если число - это двойное число со значением 1,255,000,000 (в отладчике оно отображается как 1.255E9), я передаю его в DecimalFormatter с помощью Locale.Java DecimalFormatter - различное поведение между Locale DE и Locale US

Если Locale установлен в de | DE, он преобразует число в 1.255E13.

Если Locale установлен в 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(); 

** EDIT для большей ясности **

Строки получения передается на стороне сервера код точно так, как я изложил его выше, «1.255E9 ». На странице JSP, я просто делаю HTML как

<input type="hidden" name="number" value="<%=price%>"> 
+0

Можете ли вы разместить небольшой воспроизводимый пример? –

+0

Какой метод «DecimalFormatter» вы используете? Я думаю, что я ожидал бы «ParseException» или «1.255», в зависимости от метода, потому что в DE «,» является десятичной точкой, и вы не ожидаете двух десятичных точек в числе. (для меня «NumberFormat.getInstance» (новый язык («DE»)). Parse («1,255,000,000») 'возвращает' 1.255', как и ожидалось с '',' == NumberFormat.getInstance (новый локаль (" 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 в США, а также 1.255 в DE (Германия).

+0

Как это объясняет '1.255E13', что OP замечает? –

+0

Непонятно, что результат «1.255E13» может быть воспроизведен. Что-то еще происходит, о чем OP не упомянул. –

+0

Я отредактировал вопрос для большей ясности. Исправлена ​​строка «1.255E9». – bluedevil2k

Смежные вопросы