2011-12-18 38 views
4

爲什麼在使用數字格式的Currency實例解析時生成解析異常?解析貨幣值失敗的NumberFormat

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

因爲當你解析貨幣時,字符串也應該包含貨幣符號,例如美元區域設置爲$,而盧比。印度語言環境。

例如,在印度當地這個解析罰款:nf.parse("Rs.1234.56732"),但這不成功nf.parse("1234.56732「)。所以基本上,在你的例子中,你需要附加符號與法郎符號成功解析。 DecimalFormat對象是否爲貨幣實例,因爲用於此isCurrencyInstance的字段在DecimalFormat類中聲明爲私有,並且沒有獲取它的值。