1

我有一个字符串,我试图将其解析为 BigDecimal。我正在使用以下正则表达式来去除除 -,.()$ 之外的所有非货币符号。一旦它被剥离,我就会尝试用剩余的值创建一个 BigDecimal。当括号中出现负值时,问题就开始了。有人对如何修复此实例有任何建议吗?

(1000.00) fails

我假设我必须以某种方式将括号转换为负号。

代码示例。

public BigDecimal parseClient(Field field, String clientValue, String message) throws ValidationException {
    if (clientValue == null) {
        return null;
    }

    try {
        clientValue = clientValue.replaceAll( "[^\\d\\-\\.\\(\\)]", "" );
        return new BigDecimal(clientValue.toString());
    } catch (NumberFormatException ex) {
        throw new ValidationException(message);
    }
}
4

3 回答 3

2

您将需要自己检测()字符,然后将它们剥离,从字符串的其余部分创建一个 BigDecimal,然后将其取反。

if (clientValue.startsWith('(') && clientValue.endsWith(')'))
{
   return new BigDecimal(clientValue.substring(1, clientValue.length() - 1)).negate();
}
else
{
   return new BigDecimal(clientValue);
}
于 2013-02-13T17:50:21.410 回答
1

是什么让您认为括号被正确解释BigDecimal根据文档(1000.00)输入不正确。您必须使用符号 ( )。JavaDoc 中严格定义了支持的格式。通常,它是可选符号 ( or ),后跟数字、点 ( ) 和指数。--1000.00+-.

例如,这是有效的输入:-1.1e-10.

于 2013-02-13T17:45:57.903 回答
1

DecimalFormat是更适合这项工作的工具:

DecimalFormat myFormatter = new DecimalFormat("¤#,##0.00;(¤#,##0.00)");
myFormatter.setParseBigDecimal(true);
BigDecimal result = (BigDecimal) myFormatter.parse("(1000.00)");
System.out.println(result); // -1000.00 for Locale.US
System.out.println(myFormatter.parse("($123,456,789.12)")); // -123456789.12

如您所见,它不仅会处理负面模式,还会处理货币符号、小数和分组分隔符、本地化问题等。

查看Java 教程:自定义格式以获取更多信息。

于 2013-02-13T19:00:36.487 回答