我使用java.text.NumberFormat来解析具有货币符号的字符串货币。它在某些情况下起作用,而对另一些情况则失败。
NumberFormat.getCurrencyInstance(Locale.FRANCE).parse("1 599,99 €"); //fails
NumberFormat.getCurrencyInstance(Locale.FRANCE).parse("599,99 €"); //works fine有人能解释一下为什么它在第一种情况下不起作用吗?Joda-Money是这类解析的更好的库吗?
发布于 2013-10-21 08:15:56
这可能不适用于您,原因是无效空格字符的使用。
格式类期望使用代码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补充的那样,这是已知的bug
JDK-4510618:[Fmt-Nu]法国数千分离器是不间断的空间。
周旋 (1)删除要解析的字符串中的用户分组分隔符(即U+0020)。 (2)如果删除所有空格不方便,用格式化程序的分组分隔符(U+00A0)替换用户的分组分隔符。
发布于 2013-10-21 08:06:55
这是因为您的数字1 599中的空格,它将抛出一个ParseException删除空间,它将像一个魅力一样工作。
但是,它不应该抛出异常,因为文档声明
如果可能,返回一个长(例如,在范围Long.MIN_VALUE、Long.MAX_VALUE和没有小数的范围内),否则返回双倍。如果设置了IntegerOnly,则在小数点处停止(或等效;例如,对于有理数"1 2/3",则在1之后停止)。不会抛出异常;如果不能解析对象,则将保持索引不变!
我刚刚发现这个链接状态是关于一个与此相关的bug。
https://stackoverflow.com/questions/19488923
复制相似问题