2011-12-18 2 views
4

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

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. Я хочу знать, обрабатывает ли он экземпляр валюты или экземпляр числа.

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

ответ

6

Потому что, когда вы анализируете валюту, строка также должна содержать символ валюты, например, $ для US locale и Rs. для индийского языка.

См., Например, в индийском местном этом разбирает прекрасно: nf.parse("Rs.1234.56732"), но это не удается nf.parse("1234.56732 «) Таким образом, в основном, в вашем примере вам нужно добавить символы с символом Franc для успешного разборе

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

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