1

整数にコンマを挿入して見栄えを良くするパターンを作成したいのですが、1234556操作後はのよう1,234,556になるので、次のコードを使用します。

public static void insertCommaFormly(int n)
    {
        String input = String.valueOf(n);
        String regex = "(?<=\\d)(?=(?:\\d{3},?)+$)";
        /*or we can use negative look-around*/
        regex = "(?<=\\d)(?=\\d{3}++\\b)";
        String replacement = ",";
        StringBuffer buffer = new StringBuffer();
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

        logger.info("Target string is :" + input );
        logger.info("Use regex :" + regex);

        while(matcher.find())
        {
            matcher.appendReplacement(buffer, replacement);
            logger.info(String.format("Part : '%s'", buffer));
        }
        matcher.appendTail(buffer);

        logger.info("After replace , the string is like : " + buffer.toString());
    } 

ただし、エラーが発生します(I don't know the reason!):

Dangling meta character '+' near index 16
(?<=\d)(?=\d{2}++\b)
                ^

しかし、を使用する(?<=\\d)(?=\\d{3}+\\b)と、コンパイラは文句を表示しませんが、間違った結果1234,556I don't know why results in this ?)を表示します。を使用(?<=\\d)(?=(?:\\d{3})+\\b)すると、正しい結果になります。

  So here are my two questions , please help me with these , thanks in advance!
4

3 に答える 3

1

カンマを入れる既製のDecimalFormatクラスを使ってみませんか?この質問を参照してください

「ぶら下がっているメタ文字」エラーは、「+」が正規表現(前の文字の1つ以上の出現)内で特別な意味を持っているためです。2番目の「+」を削除すると、有効になります。

于 2012-07-22T14:13:06.747 に答える
1

\d{3}++{3}は正確に3つを意味する数量詞であり、最初+の数量詞は所有格になります。これは構文的に有効ですが、無意味です。しかし、2番目+はまったく意味がありません。数量詞または所有格修飾子として機能することはできません。そのため、その例外が発生します。

あなたがやろうとしているのは、桁数が3の倍数である、いくつかの桁が続く位置に一致することです。または、正規表現として表現できる場合は、3桁の1つ以上のグループです

(?=(?:\d{3})+)

必要に応じて、1秒追加し+て所有格にすることもできます(?=(?:\d{3})++)が、結果は変わらず、パフォーマンスに目立った影響はありません。ちなみに、この仕事のために実際に使用する必要はありませappendReplacement()appendTail()

return String.valueOf(n).replaceAll("(?<=\\d)(?=(?:\\d{3})+$)", ",");

...問題なく動作します。

于 2012-07-22T15:42:55.570 に答える
0

DecimalFormat次のクラスを使用できます。

    int i = 1234556;
    DecimalFormat df = new DecimalFormat("###,###");
    String result = df.format(i);
    System.out.println(result);
于 2012-07-22T14:20:05.147 に答える