增强千位分隔符的正则表达式?

时间:2012-05-16 05:01:49

标签: javascript regex performance separator

我看到这个漂亮的脚本为js数字添加千位分隔符:

function thousandSeparator(n, sep)
{
    var sRegExp = new RegExp('(-?[0-9]+)([0-9]{3})'),
        sValue = n + '';
    if(sep === undefined)
    {
        sep = ',';
    }
    while(sRegExp.test(sValue))
    {
        sValue = sValue.replace(sRegExp, '$1' + sep + '$2');
    }
    return sValue;
}

用法:

thousandSeparator(5000000.125, '\,') //"5,000,000.125"

但是我在接受 while循环时遇到了麻烦。

我正在考虑将正则表达式更改为:'(-?[0-9]+)([0-9]{3})*' 星号 ...

但现在,我该如何应用替换声明?

现在我将$1$2..$n

如何增强替换功能?

P.S。代码取自http://www.grumelo.com/2009/04/06/thousand-separator-in-javascript/

5 个答案:

答案 0 :(得分:4)

你的假设

  

现在我将获得1美元和2美元.. $ n

错了。你有两组,因为你有两组括号。

    (-?[0-9]+)([0-9]{3})*
1.  ^^^^^^^^^^
2.            ^^^^^^^^^^

然后你重复第二组。如果它匹配第二次,它会覆盖第一次匹配的结果,当它与第三次匹配时,它会覆盖......

这意味着匹配完成后,$2包含该组的最后一场比赛的值。

第一种方法

(\d)(?=(?:[0-9]{3})+\b)

并替换为

$1,

请参阅it on Regexr

它有一个缺点,它确实在点的右边插入逗号。 (我正在努力。)

第二种方法

(\d)(?:(?=\d+(?=[^\d.]))(?=(?:[0-9]{3})+\b)|(?=\d+(?=\.))(?=(?:[0-9]{3})+(?=\.)))

并替换为

$1,

请参阅it on Regexr

现在它变得有点复杂了。

(\d)                   # Match a digit (will be reinserted)
(?:
    (?=\d+(?=[^\d.]))  # Use this alternative if there is no fractional part in the digit
    (?=(?:\d{3})+      # Check that there are always multiples of 3 digits ahead
    \b)                # Till a word boundary
    |                  # OR
    (?=\d+(?=\.))      # There is a fractional part
    (?=(?:\d{3})+      # Check that there are always multiples of 3 digits ahead
    (?=\.))            # Till a dot
)

<强>问题: 如果没有后面的字符串结尾,它也会与小数部分匹配。

答案 1 :(得分:2)

无需使用替换,您只需添加toLocaleString

console.log((5000000.125).toLocaleString('en'));

更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString

答案 2 :(得分:1)

这是一个丑陋的剧本,可以对比你美丽的剧本。

10000000.0001 .toString().split('').reverse().join('')
.replace(/(\d{3}(?!.*\.|$))/g, '$1,').split('').reverse().join('')

由于我们没有lookbehinds,我们可以通过反转字符串并使用前瞻来欺骗。

这里又是一种更可口的形式。

function thousandSeparator(n, sep) {

    function reverse(text) {
        return text.split('').reverse().join('');
    }

    var rx = /(\d{3}(?!.*\.|$))/g;

    if (!sep) {
        sep = ',';
    }

    return reverse(reverse(n.toString()).replace(rx, '$1' + sep));

}

答案 3 :(得分:0)

试试这个:

result = subject.replace(/([0-9]+?)([0-9]{3})(?=.*?\.|$)/mg, "$1,$2");

测试here

答案 4 :(得分:0)

这个怎么样:

result = "1235423.125".replace(/\B(?=(\d{3})+(?!\d))/g, ',') //1,235,423.125