Nei*_*eil 6 javascript regex jquery
我最近在回答另一个StackOverflow问题时想出了这段代码.基本上,在模糊的情况下,此代码将正确地用逗号分隔数千,并将小数保留为两位数(如美元的编写方式[7,745.56]).
我想知道是否有更简洁的方法使用正则表达式,分离和切断过多的小数位.我最近用最近的尝试更新了这篇文章.使用正则表达式有更好的方法吗?
7456 -> 7,456
45345 -> 45,345
25.23523534 -> 25.23
3333.239 -> 3,333.23
234.99 -> 234.99
2300.99 -> 2,300.99
23123123123.22 -> 23,123,123,123.22
Run Code Online (Sandbox Code Playgroud)
var result;
var str = []
reg = new RegExp(/(\d*(\d{2}\.)|\d{1,3})/, "gi");
reversed = "9515321312.2323432".split("").reverse().join("")
while (result = reg.exec(reversed)) {
str.push(result[2] ? result[2] : result[0])
}
console.log(str.join(",").split("").reverse().join("").replace(",.","."))Run Code Online (Sandbox Code Playgroud)
arc*_*rcs 10
作为Regex的替代方案,您可以使用以下方法
Number(num.toFixed(2)).toLocaleString('en-US')
Run Code Online (Sandbox Code Playgroud)
要么
num.toLocaleString('en-US', {maximumFractionDigits: 2})
Run Code Online (Sandbox Code Playgroud)
你仍然会有toFixed(2),但它很干净.toFixed(2)虽然不会像你想要的那样落地.与{maximumFractionDigits: 2}第二个参数相同toLocaleString.
var nums = [7456, 45345, 25.23523534, 3333.239, 234.99, 2300.99, 23123123123.22]
for (var num of nums)
console.log(num, '->', Number(num.toFixed(2)).toLocaleString('en-US') )Run Code Online (Sandbox Code Playgroud)
像你展示的那样对地板进行地板铺设有点棘手.做某事(num * 100 | 0) / 100不起作用.计算失去精度(例如,在某些情况下,.99将变为.98).(|0也不适用于较大的数字,但即使Math.floor()有精度问题).
解决方案是将数字视为字符串.
function format(num) {
var num = num.toLocaleString('en-US')
var end = num.indexOf('.') < 0 ? num.length : num.indexOf('.') + 3
return num.substring(0, end)
}
Run Code Online (Sandbox Code Playgroud)
var nums = [7456, 45345, 25.23523534, 3333.239, 234.99, 2300.99, 23123123123.22]
for (var num of nums) console.log(num, '->', format(num))
function format(num) {
var num = num.toLocaleString('en-US')
var end = num.indexOf('.') < 0 ? num.length : num.indexOf('.') + 3
return num.substring(0, end)
}Run Code Online (Sandbox Code Playgroud)
(当更改为另一种格式时,请'en-US'注意 .数字,因为某些语言使用,分形分隔符)
对于兼容性,CanIUse toLocaleString('en-US')表示
有效地支持所有浏览器(因为IE6 +,Firefox 2 +,Chrome 1+等)
如果你真的坚持纯正在使用正则表达式(并截断而不是舍入小数位),我能想到的唯一解决方案是使用替换函数作为第二个参数.replace():
('' + num).replace(
/(\d)(?=(?:\d{3})+(?:\.|$))|(\.\d\d?)\d*$/g,
function(m, s1, s2){
return s2 || (s1 + ',');
}
);
Run Code Online (Sandbox Code Playgroud)
这使您的所有测试用例都通过:
function format(num){
return ('' + num).replace(
/(\d)(?=(?:\d{3})+(?:\.|$))|(\.\d\d?)\d*$/g,
function(m, s1, s2){
return s2 || (s1 + ',');
}
);
}
test(7456, "7,456");
test(45345, "45,345");
test(25.23523534, "25.23"); //truncated, not rounded
test(3333.239, "3,333.23"); //truncated, not rounded
test(234.99, "234.99");
test(2300.99, "2,300.99");
test(23123123123.22, "23,123,123,123.22");
function test(num, expected){
var actual = format(num);
console.log(num + ' -> ' + expected + ' => ' + actual + ': ' +
(actual === expected ? 'passed' : 'failed')
);
}Run Code Online (Sandbox Code Playgroud)