2013-02-13 83 views
1

我有一个字符串,我试图解析成一个BigDecimal。我使用以下正则表达式来除去 - ,.()$之外的所有非货币符号。一旦它被剥离,我然后尝试创建一个剩余值的BigDecimal。问题在括号中出现负值时开始。有没有人对如何修复这个实例有任何建议?带负大括号的Java负大十进制值

(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); 
    } 
} 
+0

您不描述输入字符串的格式。它真的很奇怪,你不能使用DecimalFormat实例来解析字符串?如果不是,你为什么试图通过自己操纵弦来重塑车轮? – jarnbjo 2013-02-13 17:55:47

+0

这是否有帮助: http://stackoverflow.com/questions/2056400/format-negative-amount-of-usd-with-a-minus-sign-not-brackets-java – GJ13 2013-02-13 18:07:55

+0

这些值是由a用户。这些值就是5000.00,5000.00,5000.00,5000,-5000.00,(5000.00),(5000.00),(-5000.00),(-5000.00)。最后,他们需要5000.00,(-5000.00),-5000.00,以便他们可以传入一个大的数字。 – 2013-02-13 19:09:20

回答

2

您将需要自己检测()字符,然后将其去除,从字符串的其余部分创建一个BigDecimal并将其取消。

if (clientValue.startsWith('(') && clientValue.endsWith(')')) 
{ 
    return new BigDecimal(clientValue.substring(1, clientValue.length() - 1)).negate(); 
} 
else 
{ 
    return new BigDecimal(clientValue); 
} 
+0

这几乎可以工作,但是当你有(-1000.00)这是一个有效值时否定为正值1000.00 – 2013-02-13 19:52:38

+0

然后你需要在子串的开头检测一个可能的' - '字符,如果它在那里,不要不否定,所以你的结果保持负面。 – rgettman 2013-02-13 19:57:42

+0

这就是我所做的,虽然数学不会是一个负数? – 2013-02-13 20:11:23

1

是什么让你认为圆括号被BigDecimal正确解释? (1000.00)是错误的输入according to the documentation。您必须使用-符号(-1000.00)。支持的格式在JavaDoc中严格定义。通常它是可选符号(+-),后跟数字,点(.)和指数。

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

+0

那么你的建议在第一个大括号后面加上负号? – 2013-02-13 17:47:37

+0

好吧,我必须简单地忽略这一点,因为CurrencyFormatter将值发送到前端而没有减号,导致它在提交到后端时失败。 – 2013-02-13 17:49:20

0

我认为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 

正如你所看到的,它不仅将处理消极模式,但也有货币符号,小数和分组分隔符,本地化问题等。

查看The Java Tutorials: Customizing Formats了解更多信息。