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 类来为您输入逗号?看到这个问题

“悬空元字符”错误是因为“+”在正则表达式中具有特殊含义(前一个字符出现一次或多次),如果删除第二个“+”它应该是有效的。

于 2012-07-22T14:13:06.747 回答
1

\d{3}++中,the{3}是一个量词,正好表示三个,第一个+使量词具有所有格,这在语法上是有效的,但没有意义。但是第二个+根本没有意义。它不能用作量词或所有格修饰符,这就是您遇到该异常的原因。

您要做的是匹配一个后跟一些数字的位置,其中数字的数量是三的倍数 - 或者,就可以表示为正则表达式的术语而言,一组或多组三位数

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

如果您愿意,您可以添加一秒钟+以使其具有所有格(?=(?:\d{3})++)- 但它不会改变结果并且不会对性能产生明显影响。顺便说一句,您实际上不必使用appendReplacement()andappendTail()来完成这项工作:

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 回答