Ошибка при обработке значения валюты NumberFormat - PullRequest
4 голосов
/ 18 декабря 2011

Почему следующее генерирует исключения синтаксического анализа при разборе с использованием экземпляров Currency числового формата.

    float f1    =   123.45678f;
    Locale  locFR   =   new Locale("fr");
    NumberFormat[] nfa  =   new NumberFormat[4];

    nfa[0]  =   NumberFormat.getInstance(); //default
    nfa[1]  =   NumberFormat.getInstance(locFR);    //FranceLocale
    nfa[2]  =   NumberFormat.getCurrencyInstance(); //Default Currency
    nfa[3]  =   NumberFormat.getCurrencyInstance(locFR); //French Currency

    for (NumberFormat nf : nfa){

        System.out.println("----------- " +  nf.getClass().getName() + "-----------------------");
        System.out.println("Default maximum fraction digits : " + nf.getMaximumFractionDigits());
        System.out.println(nf.format(f1));

        nf.setMaximumFractionDigits(5);
        System.out.println("Maximum fraction digits updated to : " + nf.getMaximumFractionDigits());
        System.out.println(nf.format(f1));

        try{
            nf.setMaximumFractionDigits(5);
            System.out.println("parsed string: " + nf.parse("1234.56732"));
            nf.setParseIntegerOnly(true);
            System.out.println("after setParseIntegerOnly" + nf.parse("1234.567"));
        }catch (Exception e){e.printStackTrace();}; 

Вывод вышеприведенного равен

----------- java.text.DecimalFormat-----------------------
Default maximum fraction digits : 3
123.457
Maximum fraction digits updated to : 5
123.45678
parsed string: 1234.56732
after setParseIntegerOnly1234
----------- java.text.DecimalFormat-----------------------
Default maximum fraction digits : 3
123,457
Maximum fraction digits updated to : 5
123,45678
parsed string: 1234
after setParseIntegerOnly1234
----------- java.text.DecimalFormat-----------------------
Default maximum fraction digits : 2
ú123.46
Maximum fraction digits updated to : 5
ú123.45678
java.text.ParseException: Unparseable number: "1234.56732"
    at java.text.NumberFormat.parse(Unknown Source)
    at TwoMinuteDrillTests.doExamples(TwoMinuteDrillTests.java:859)
    at TwoMinuteDrillTests.main(TwoMinuteDrillTests.java:871)
----------- java.text.DecimalFormat-----------------------
Default maximum fraction digits : 2
123,46 ñ
Maximum fraction digits updated to : 5
123,45678 ñ
java.text.ParseException: Unparseable number: "1234.56732"
    at java.text.NumberFormat.parse(Unknown Source)
    at TwoMinuteDrillTests.doExamples(TwoMinuteDrillTests.java:859)
    at TwoMinuteDrillTests.main(TwoMinuteDrillTests.java:871)

Похоже, синтаксический анализ чисел - это хорошо, но он задыхается, когда дело касается использования двух экземпляров валюты, а именно:

    nfa[2]  =   NumberFormat.getCurrencyInstance(); //Default Currency
    nfa[3]  =   NumberFormat.getCurrencyInstance(locFR); //French Currency

Также есть ли способ узнать, какой тип объекта обрабатывается внутри цикла for?Я использовал nf.getClass().getName() в приведенном выше примере, но он всегда возвращает универсальный тип DecimalFormat.Я хочу знать, обрабатывает ли он экземпляр валюты или номер.

Заранее спасибо.

1 Ответ

6 голосов
/ 18 декабря 2011

Потому что, когда вы анализируете валюту, строка также должна содержать символ валюты, например, $ для локали США и РТС. для локали Индии.

Длянапример, в индейском языке это хорошо разбирается: nf.parse("Rs.1234.56732"), но это не удается nf.parse("1234.56732 "). Поэтому в основном в вашем примере вам нужно добавить символы с символом франка для успешного разбора.

Также я могу 'Я не вижу прямого способа определить, является ли объект DecimalFormat экземпляром валюты, так как поле, используемое для этого isCurrencyInstance, объявлено закрытым в классе DecimalFormat, и для него нет метода получения.

...