如何将字符串解析为BigDecimal而不出错

3

当我想将String数组中的值解析为BigDecimal时,出现了这个错误:

Exception in thread "main" java.text.ParseException: Unparseable number: "86400864008640086400222"

我正在网上搜索解决这个问题的方法。也许你们知道吗?

使用BigDecimal不是我的想法,但不幸的是我必须这么做。我找到了一些代码,它应该将值从字符串更改为BigDecimal并返回:

public static BigDecimal parseCurrencyPrecise (String value) throws ParseException
{
    NumberFormat  format = NumberFormat.getCurrencyInstance ();
    if (format instanceof DecimalFormat)
        ((DecimalFormat) format).setParseBigDecimal (true);

    Number  result = format.parse (value);
    if (result instanceof BigDecimal)
        return (BigDecimal) result;
    else {
        // Oh well...
        return new BigDecimal (result.doubleValue ());
    }
}

这里是我的代码,当我尝试解析时:

public void Function() throws ParseException {
    String [] array;
    array=OpenFile().split("\\s");
    for(int i = 10 ;i < array.length; i+= 11) {
        BigDecimal EAE = parseCurrencyPrecise(array[i]);
        System.out.println(EAE);
    }
}

OpenFile函数打开数据文件并以此方式读取:temp += line + " "。这就是为令我使用\s进行分割的原因。这适用于字符串和整数,但BigDecimal会出现问题。

祝好,


你的所在地区是否有货币符号放在非常大的数字之前?我可以用一个货币符号来复制这个错误,但当我使用美元符号(我的所在地区的货币)时它是有效的。 - rgettman
这个本地符号出了什么问题?我今天开始使用BigDecimal,听说有一些关于本地符号的文章。 - Agnes
请使用BigDecimal.valueOf(result.doubleValue())代替new BigDecimal(result.doubleValue()) - Tom
3
请不要使用BigDecimal.valueOf(result.doubleValue())new BigDecimal(result.doubleValue()),因为它们都会导致在处理一些非常大的数字时丢失精度。最好忘记NumberFormat,直接使用以String作为参数的BigDecimal构造函数。 - Dawood ibn Kareem
2个回答

3

如果你不想自己处理解析,可以使用BigDecimal(String val)构造函数。参考Javadoc

BigDecimal(String val)
Translates the string representation of a BigDecimal into a BigDecimal

例如:

BigDecimal bigDecimal = new BigDecimal("86400864008640086400222");

请参阅Javadoc以了解构造函数所接受的格式。


你们Mike Kobit和markbernard说得对,这个程序对我也很有效。 感谢大家的帮助。 - Agnes

2

您为什么不能使用构造函数呢?看起来您正在使它比必须的更加复杂。这对我有效:

System.out.println(new BigDecimal("86400864008640086400222"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接