3

我正在使用java.text.NumberFormat解析具有货币符号的字符串货币。它在某些情况下有效,而在其他情况下失败。

NumberFormat.getCurrencyInstance(Locale.FRANCE).parse("1 599,99 €"); //fails
NumberFormat.getCurrencyInstance(Locale.FRANCE).parse("599,99 €"); //works fine

有人可以解释为什么它在第一种情况下不起作用吗?对于这种类型的解析,Joda-Money 是一个更好的库吗?

4

2 回答 2

3

这可能对您不起作用的原因是使用了无效的空白字符。

格式类期望代码为 160 的字符被描述为“不间断空格”,当您可以传递代码 30 的字符为“空格”时。

您可以运行此代码来检查它。

NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.FRANCE);

String france = "1 599,99 €";
String format = currencyInstance.format(1599.99);
Number number = currencyInstance.parse(format);


System.out.println("France: " + format);
System.out.println("Format: " + format);
System.out.println("Number: " + number);

if(france.equals(format)) {
    number = currencyInstance.parse(france); // Must work;
    System.out.println(number);
} else {

    char[] fr = france.toCharArray();
    char[] ft = format.toCharArray();

    for(int i = 0; i < fr.length; i++) {
        if(fr[i] != ft[i]) {
            System.out.printf("The value on position %d are not equal. France: %d; Format: %d", i,(int)fr[i], (int)ft[i]);
        }
    }

}

然后环境细节:

 java version "1.7.0_17"
 Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
 Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
 OS: Windows 7 64-bits. 

ASCII 表

笔记:

正如@Black Panter 添加的那样,这是已知的错误

JDK-4510618:[Fmt-Nu] 法语千位分隔符是不间断空格

解决方法

(1) 在待解析的String中去掉用户的分组分隔符(即U+0020)。

(2) 如果不方便删除所有空格,请将用户的分组分隔符替换为格式化程序的分组分隔符(U+00A0)。

于 2013-10-21T08:15:56.620 回答
1

这是因为你的号码中有空格1 599,它会抛出 ParseException 删除空格,它会像魅力一样工作

但正如文档所述,它不应​​该抛出异常

如果可能,则返回 Long(例如,在 [Long.MIN_VALUE, Long.MAX_VALUE] 范围内且没有小数),否则返回 Double。如果设置了 IntegerOnly,将在小数点处停止(或等效项;例如,对于有理数“1 2/3”,将在 1 之后停止)。不抛出异常;如果没有对象可以解析,则索引不变!

我刚刚发现这个链接 声明了一个与此相关的错误。

于 2013-10-21T08:06:55.633 回答