2010-07-14 3 views
2

Я хотел бы форматировать числа типа double с немецкой локали в Java. Однако что-то идет не так, поскольку вывод следующего кода: 0,0Проблема Java DecimalFormat

package main; 

import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.text.ParseException; 
import java.util.Locale; 

public class Test { 

    private static String decimal2Format = "000.000"; 

    public static void main(String args[]){ 
     DecimalFormat format = (DecimalFormat)NumberFormat.getInstance(new Locale("de")); 
     double value = 0; 
     try { 
      format.applyPattern(decimal2Format); 
      value = format.parse("0.459").doubleValue(); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     System.out.println(value); 
    } 

} 

У вас есть идеи, что не так или нет?

Спасибо, Аттикус

ответ

9

Вы пытаетесь анализировать, используя шаблон, который будет ожидать запятой (как это на немецком языке), но вы дали ему период («0.459»). Похоже, DecimalFormat останавливает синтаксический анализ, когда видит персонажа, которого он не понимает. Если вы измените его на «0,459», вы увидите, что он правильно разобратся, а затем вывести «0,459». (Я не уверен, используется ли System.out.println локаль системы по умолчанию, в этом случае мощь печати «0459», в зависимости от вашего местонахождения.)

Обратите внимание, что вы не пытались формат число на всех в этом коде - только parse a number. Если вы хотите отформатировать его, выберите формат звонка. Сам double не имеет соответствующего формата - это всего лишь число. Это не похоже на разбор с использованием определенного форматирования, возвращающего значение, которое сохраняет этот формат.

Вот код, который будет выполнять фактические форматирование двойного значение:

DecimalFormat format = (DecimalFormat)NumberFormat.getInstance(new Locale("de")); 
double value = 0.459; 
String formatted = format.format(value); 
System.out.println(formatted); // Prints "0,459" 

EDIT: Хорошо, так что это звучит, как вы преобразование из одного формата в другой (из США в странах Европы, для пример). Это означает, что вы, вероятно, должны использовать два разных объекта DecimalFormat - вы можете использовать , чтобы переключить язык между вызовами, но это звучит немного мрачно для меня.

Я считаю, что один из способов разобрать и обнаружить ошибки - использовать перегрузку parse, которая также принимает ParsePosition. Установите позицию на 0, чтобы начать, а затем проверьте, что она находится в конце строки - если это не так, это означает, что синтаксический анализ эффективно завершился неудачей. Мне показалось странным, что нет такого метода, который бы делал это автоматически и выдавал исключение, но я не вижу его ...

Возможно, вы также захотите установить синтаксический анализатор для создания BigDecimal вместо double , если вы имеете дело со значениями, которые более логично десятичны по своей природе. Вы можете сделать это с помощью метода setParseBigDecimal.

+0

Две вещи по этой проблеме: Моя цель - проанализировать, так как я получаю ввод как строку, поэтому на самом деле мне нужно разобрать, а затем отформатировать его. Тогда в этом случае я думаю, что я должен использовать методы разбора и форматирования, правильно? Еще одна вещь с разбором - это то, что мне нужно, чтобы он разбирался немного иначе. Я использую это в модуле проверки, поэтому, когда я получаю строку «234.a23», я не хочу, чтобы она была «234.0» после проверки, но я хочу, чтобы исключение синтаксического анализа указывало на то, что что-то пошло не так. Вы знаете какой-либо класс, который будет вести себя таким образом, или я должен выполнить свою собственную проверку? – Atticus

+0

@Atticus: Я отредактировал свой ответ ... надеюсь, что это поможет. –

+0

Спасибо за ответ! Это помогло. – Atticus

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