【问题标题】:NumberFormat parsing currency value failureNumberFormat 解析币值失败
【发布时间】:2012-01-23 02:13:20
【问题描述】:

为什么在使用数字格式的货币实例进行解析时会产生以下解析异常。

    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。我希望能够知道它是在处理货币实例还是数字实例。

提前致谢。

【问题讨论】:

    标签: java string datetime text formatting


    【解决方案1】:

    因为在解析货币时,字符串也应该包含货币符号,例如 $ 用于美国语言环境,Rs. 用于印度语言环境。

    例如在印度本地,这可以很好地解析:nf.parse("Rs.1234.56732") 但这失败了nf.parse("1234.56732")。所以基本上,在您的示例中,您需要在符号后面附加法郎符号才能成功解析。

    我也看不到任何直接的方法来确定 DecimalFormat 对象是否是货币实例,因为用于此 isCurrencyInstance 的字段在 DecimalFormat 类中被声明为私有,并且没有 getter。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2019-07-22
      • 2014-04-05
      • 2011-03-28
      相关资源
      最近更新 更多