Проблема Java DecimalFormat - PullRequest
       8

Проблема Java DecimalFormat

2 голосов
/ 14 июля 2010

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

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);
    }

}

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

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

1 Ответ

9 голосов
/ 14 июля 2010

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

Обратите внимание, что вы даже не пытались отформатировать число в этом коде - только анализ число. Если вы хотите отформатировать его, позвоните в формате. Сам 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"

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

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

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

...