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

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 に答える
1

によって括弧が正しく解釈されると考える理由は何BigDecimalですか? ドキュメントによると、(1000.00)間違った入力です。記号 ( )を使用する必要があります。サポートされる形式は JavaDoc で厳密に定義されています。一般に、オプションの記号 (または) の後に数字、ドット ( ) および指数が続きます。--1000.00+-.

たとえば、これは有効な入力です: -1.1e-10.

于 2013-02-13T17:45:57.903 に答える