Java 将BRL货币值字符串解析为双精度

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

我试图解析以下字符串:“59000,00”

在巴西,逗号用于表示小数点,而点则用作分隔千位的符号

我想做的是:

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!我有个例外,忘了在问题中提到这个!编辑。我不得不从两种空间中进行替换。谢谢。