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

11 浏览
0 Comments

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

我看到了一个很好的脚本,可以给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})*'星号...

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

现在我会有$1$2..$n

我该如何改进replace函数?

附:代码来源于这里 http://www.grumelo.com/2009/04/06/thousand-separator-in-javascript/

0
0 Comments

问题出现的原因是因为代码中使用了正则表达式来添加千位分隔符,但是在一些情况下,代码的执行效率较低。为了解决这个问题,作者对代码进行了改进,使用了字符串反转和正则表达式的前瞻来实现添加千位分隔符的功能。

解决方法是将字符串反转,并使用正则表达式的前瞻来匹配每三个数字的位置,并在这些位置上添加千位分隔符。最后再将字符串反转回来,得到最终的结果。

这个问题的解决方法如下所示:

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));
}

还有代码的执行效率问题,并表示希望能够找到更高效的解决方法。同时,还有可能需要先处理字符串右侧的数字,并在此基础上进行改进。对于这一问题,作者提出了疑问,并期待其他人能够给出更好的解决方案。

整体而言,这是一个关于如何优化正则表达式添加千位分隔符的问题,通过字符串反转和正则表达式的前瞻,作者提出了一种解决方法,并对其效率进行了讨论。

0
0 Comments

问题出现的原因是作者原先的正则表达式匹配了多个括号中的内容,但是后续的匹配会覆盖前面的匹配结果。为了解决这个问题,作者提出了两个方法。

第一种方法是使用正向零宽断言来匹配数字的位置,并在匹配到的位置后面插入逗号。这种方法的缺陷是它也会在小数点的右侧插入逗号。

第二种方法是在第一种方法的基础上进行改进,使用多个正向零宽断言来匹配数字的位置,并在匹配到的位置后面插入逗号。这种方法更加复杂,但可以解决第一种方法的缺陷。

还有两个问题:其一是这种方法在数字的小数部分也会进行匹配;其二是需要使用循环来匹配多个数字。作者已经对第二个问题进行了解决,但对于第一个问题还没有找到解决方法。

最后,作者表示已经找到了解决第一个问题的方法,并请读者测试。

0
0 Comments

问题的出现原因:用户想要在JavaScript中使用正则表达式来实现千位分隔符的功能。

解决方法:不需要使用replace函数,可以直接使用toLocaleString函数来实现。具体代码如下:

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

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

其他人在回答中提到了使用正则表达式的方法,但是建议不要使用正则表达式,因为使用原生的方式更好、更容易理解。

用户表示会从现在开始使用toLocaleString函数,并且感觉自己作为一个新手没有掌握到这个知识真的很傻。用户以前使用正则表达式实现这个功能,但是每次都搞砸了,所以不得不再次搜索。但是这次用户可能不会忘记这个方法了,而且还有本地化的功能,太棒了!

0