2015-02-16 2 views
1

Я пытаюсь создать двойной объект из десятичной строки, где запятая является плавающим разделителем.Преобразование строкового значения с запятой в десятичное с правильной локалью

Передача аргументов локали в виртуальную машину:

-Duser.country=BR 
-Duser.language=PT 


String value = "500,21";   
Double dob = new Double(value); 

Getting исключение:

java.lang.NumberFormatException: Для ввода строки: "500,21" в sun.misc.FloatingDecimal.readJavaFormatString (FloatingDecimal.java:1224) на java.lang.Double.valueOf (Double.java:475) в java.lang.Double. (Double.java:567)

+0

Просто замените запятую точкой и она всегда будет работать;) – engineercoding

+0

Я знаю, но я прошу относительно изменения локали – Tirmean

+1

Разбор и форматирование объектов Double, Integer, Float и др. Очень плохие (и старые) , Они не поддерживают Locales: см. Javadoc для Double.valueOf (который, как мне кажется, вызывает вызов конструктора). Итак, как говорит Мена, вы должны использовать NumberFormat. –

ответ

0

Похоже, что new Double(value) не принимает во внимание настройки локали.

Реализация завершает вызов этого метода here, и он ищет только «.».

С языковым параметром, как вы сделали вы можете использовать это:

NumberFormat.getInstance().parse(value).doubleValue() 

Here аналогичная дискуссия.

1

Вы можете попробовать с локализованным NumberFormat:

String value = "500,21"; 
// replace the hard-coded Locale definition with your arguments, or 
// Locale.getDefault(), etc. 
NumberFormat nf = NumberFormat.getInstance(new Locale("pt", "BR")); 
try { 
    Double d = nf.parse(value).doubleValue(); 
    System.out.println(d); 
} 
catch (ParseException pe) { 
    // TODO 
} 

Выход

500.21 
+0

Бедро может работать, но любая причина Double (string) не работает с предоставленным языком? – Tirmean