【问题标题】:Parsing currency to double raising exception解析货币以加倍引发异常
【发布时间】:2016-10-17 23:22:34
【问题描述】:

我有一个字符串“R$3.333,33”,我正在尝试使用此方法将其解析为双精度值:

public static BigDecimal parse(final String amount, final Locale locale) throws ParseException {
        final NumberFormat format = NumberFormat.getCurrencyInstance(locale);
        if (format instanceof DecimalFormat) {
            ((DecimalFormat) format).setParseBigDecimal(true);
        }
        return (BigDecimal) format.parse(amount.replaceAll("[^\\d.,]", ""));
    }

但我得到一个例外,上面写着:

W/System.err: java.text.ParseException: Unparseable number: "3.333,33" (at offset 8)

我的使用方式如下:

Ferramentas.parse(value.getText().toString(), Locale.FRANCE)

【问题讨论】:

标签: java android parsing currency


【解决方案1】:

我找到的唯一解决方案是在您的正则表达式中替换 .

return (BigDecimal) format.parse(amount.replaceAll("[^\\d,]",""));

我无法解析数千个带有. 的数字。

  • 如果您保留 .,它将被解析为 3
  • 如果将. 替换为,,它会被解析为3.333

如果有人为数千人提供. 的解决方案,我真的很想听听。

【讨论】:

    【解决方案2】:

    看看this question and answer

    虽然看起来像重复,但parse 方法在您输入“R$ 3.333,33”时有效(注意货币符号和值之间的空格)。

    要在货币符号和值之间插入空格,可以使用如下方法:

    public static String insertSpaceBetweenSymbolAndValue(String s)
    {
        int index = 0;
        while (index < s.length() && !Character.isDigit(s.charAt(index)))
            index++;
        return (index != s.length()) ? s.substring(0, index) + " " + s.substring(index) : s;
    }
    

    【讨论】:

    • 如何在值和符号之间放置空格?
    • @AND4011002849 编辑了我的答案以包含这种方法。
    • 从该答案开始一切正常,直到您为数千人添加 .
    • 你保留replaceAll()吗?
    • 事实上,如果我保留replaceAll(),它就不会被解析。
    【解决方案3】:

    为什么不删除'R$',然后解析你的双精度数?

    String s = b.substring(3, b.length()); 
    Double d = Double.valueOf(s);
    

    【讨论】:

    • 他已经在移除 R$:amount.replaceAll("[^\\d.,]", "").
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多