0

文字列のリストがあり、パターンが一致した場合に浮動小数点に変換したいと考えています。

いくつかの値と期待される結果は次のとおりです。

1000         -> 1000.0
1.000        -> 1000.0
1.000,000    -> 1000.0
-1.000,000   -> -1000.0
9,132        -> 9.132
1,000.00     -> invalid
30.10.2010   -> invalid
1,000.000,00 -> invalid

数値が有効かどうかを確認するために次のコードを試しましたが、パターンが一致することはありません。

Pattern pattern = Pattern.compile("#.###,###");
for(String s : list){
    Matcher m = pattern.matcher(s); 
    if(m.matches()){
         //convert
    }
}

それに加えて、私はこのコードを使用しようとしました:

 DecimalFormat df = (DecimalFormat) NumberFormat.getCurrencyInstance();
 for(String s : list){
        try {
            Number num = df.parse(s);
            //..
        } catch (ParseException e) {

        } 
    }

このコードの問題は、パターンベースの検証が実行されないことです。たとえば、 のような日付2012/05/30は に変換され2012ます。

では、有効なパターンを定義したりDecimalFormat、ニーズに合わせて構成したりするにはどうすればよいでしょうか?

4

4 に答える 4

3

クラスはPattern正規表現で動作します。おそらくこれが必要です:

Pattern pattern = Pattern.compile("-?\d\.\d{1,3}(,\d{1,3})?");

正確にどの形式を一致させたいか、または一致させたくないかに応じて、この正規表現を調整することをお勧めします。

于 2012-06-05T23:53:36.420 に答える
2

これがあなたの望むものだと思います。コメントはそれを説明する必要があります。

@Test
public void testAllValues() {
    testValue("1000", "1000");
    testValue("1.000,000", "1000");
    testValue("-1.000,000", "-1000");
    testValue("9,132", "9.132");
    testValue("1,000.00", null);
    testValue("30.10.2010", null);
    testValue("1,000.000,00", null);
}

private void testValue(String germanString, String usString) {
    BigDecimal germanDecimal = (BigDecimal) parse(germanString);
    if (usString != null) {
        BigDecimal usDecimal = new BigDecimal(usString);
        assertEquals("German " + germanString + " did not equal US " + usString, 0, germanDecimal.compareTo(usDecimal));
    } else {
        assertEquals("German " + germanString + " should not have been pareseable", null, germanDecimal);
    }
}

public BigDecimal parse(String s) {
    // Patch because parse doesn't enforce the number of digits between the
    // grouping character (dot).
    if (!Pattern.matches("[^.]*(\\.\\d{3})*[^.]*", s)) {
        return null;
    }

    DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMANY);
    df.setParseBigDecimal(true);

    // Have to use the ParsePosition API or else it will silently stop
    // parsing even though some of the characters weren't part of the parsed
    // number.
    ParsePosition position = new ParsePosition(0);
    BigDecimal parsed = (BigDecimal) df.parse(s, position);

    // getErrorIndex() doesn't seem to accurately reflect errors, but
    // getIndex() does reflect how far we successfully parsed.
    if (position.getIndex() == s.length()) {
        return parsed;
    } else {
        return null;
    }
}
于 2012-06-06T01:30:28.010 に答える
1

試す

System.out.println("1,000.000,00".matches("^[+-]?\\d+(\\.\\d{3})*(,\\d+)?"));

あなたの番号が + で始まるかどうかわからないので、念のため追加しました。また、0100000.000.000,1234 が有効かどうかもわかりません。理由を教えていただけない場合は、正規表現が修正されます。

于 2012-06-06T00:04:41.480 に答える
0

パターンがコンマの場合は、次を試してください。

String[] splitted = string.split(",")

もしsize of splitted > 2--> 無効。

もしsplitted.size == 2 && splitted[1].split(".") > 0--> も無効です。

形式に問題がない場合 --> すべてのポイントを削除し、カンマをポイントに置き換え、カンマの後の文字列を解析して int にし、ピースを接続します。

非常に単純なアプローチですが、うまくいきます...

于 2012-06-06T00:49:48.803 に答える