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

Roy*_*mir 2 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;
}
Run Code Online (Sandbox Code Playgroud)

用法:

thousandSeparator(5000000.125, '\,') //"5,000,000.125"
Run Code Online (Sandbox Code Playgroud)

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

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

但是现在,我该如何应用replace语句?

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

如何增强替换功能?

ps的代码是从这里http://www.grumelo.com/2009/04/06/thousand-separator-in-javascript/

lus*_*chn 7

无需使用替换,您可以添加toLocaleString

console.log((5000000.125).toLocaleString('en'));
Run Code Online (Sandbox Code Playgroud)

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


ste*_*ema 5

你的假设

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

是错的。您有两组,因为您有两组括号。

    (-?[0-9]+)([0-9]{3})*
1.  ^^^^^^^^^^
2.            ^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

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

第一种方法

(\d)(?=(?:[0-9]{3})+\b)
Run Code Online (Sandbox Code Playgroud)

并替换为

$1,
Run Code Online (Sandbox Code Playgroud)

它Regexr

它有一个缺陷,它确实也在点的右边插入了逗号。(我正在做。)

第二种方法

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

并替换为

$1,
Run Code Online (Sandbox Code Playgroud)

它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
)
Run Code Online (Sandbox Code Playgroud)

问题: 如果后面没有字符串的结尾,则也匹配小数部分。