使用符号解析货币:并非所有情况都有效 - Java

时间:2013-10-21 07:53:46

标签: java currency

我正在使用java.text.NumberFormat来解析具有货币符号的String货币。它适用于某些情况,而其他情况则失败。

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

有人可以解释一下为什么它不适用于第一种情况? Joda-Money是这种解析的更好的库吗?

2 个答案:

答案 0 :(得分:2)

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

格式类期望代码为160的char被描述为“非破坏空间”,当你可以传递代码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 table

注意:

正如@Black Panter所说,这是已知错误

JDK-4510618 : [Fmt-Nu] French thousands separator is non-breaking space

  

周围的工作

     

(1)删除字符串中的用户分组分隔符(即U + 0020)   解析。

     

(2)用格式化程序的分组替换用户的分组分隔符   分离器(U + 00A0)如果不方便移除所有空间。

答案 1 :(得分:1)

由于数字1 599中的空格,它会抛出ParseException 删除空间,它将像魅力一样工作

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

  

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

我刚发现这个Link 说明与此相关的错误。