Java 将BRL货币值字符串解析为双精度
我试图解析以下字符串:“59000,00” 在巴西,逗号用于表示小数点,而点则用作分隔千位的符号 我想做的是:Java 将BRL货币值字符串解析为双精度,java,string,parsing,format,currency,Java,String,Parsing,Format,Currency,我试图解析以下字符串:“59000,00” 在巴西,逗号用于表示小数点,而点则用作分隔千位的符号 我想做的是: final String price = "59000,00"; // LocaleUtils.getLocale returns new Locale("pt", "BR") final NumberFormat numberFormat = NumberFormat.getCurrencyInstance(LocaleUtils.getLocale()); try { fin
final String price = "59000,00";
// LocaleUtils.getLocale returns new Locale("pt", "BR")
final NumberFormat numberFormat = NumberFormat.getCurrencyInstance(LocaleUtils.getLocale());
try {
final double d = numberFormat.parse(price).doubleValue();
// do stuff
} catch (ParseException e) {
// do stuff
}
然而,我得到了一个异常。为什么会这样
java.text.ParseException:不可解析的数字:“59000,00”(偏移量为8)
您可以使用德语语言环境,因为它使用逗号作为十进制分隔符。像这样:
NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
double df = nf.parse(price).doubleValue();
这个单元测试在Java8中对我有效,但在Java11-15中失败
@测试
public void TestBazilianReal()引发异常{
//安排
地区巴西=新地区(“pt”、“BR”);
DecimalFormat=(DecimalFormat)DecimalFormat.getCurrencyInstance(巴西);
预期双精度=双精度.parseDouble(“1234.56”);
ParsePosition pos=新的ParsePosition(0);
//表演
数字结果=format.parse(“R$1.234,56”,pos);
//断言
资产质量(预期,结果,“巴西地区”);
}
在Java11中,上述测试失败,原因是
org.opentest4j.AssertionFailedError: Brazil locale ==> expected: <1234.56> but was: <null>
at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55)
org.opentest4j.AssertionFailedError:Brazil语言环境==>应为:但为:
位于org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55)
更新:找到了问题的根源。在JDK11+中,它们将R$\00A0
更改为positivePrefix,其中\00A0
是
而不是实空格字符
请参阅:您的代码没有返回预期的输出,抛出异常,是否执行其他操作?你没有问任何问题。@luk2302 D'oh!我有个例外,忘了在问题中提到这个!编辑。我不得不从两种空间中进行替换。谢谢。