2011-12-18 40 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类中声明为私有,并且没有获取它的值。