我看到这个漂亮的脚本为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/
答案 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'));
答案 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)
答案 4 :(得分:0)
这个怎么样:
result = "1235423.125".replace(/\B(?=(\d{3})+(?!\d))/g, ',') //1,235,423.125