Javascript 正则表达式用逗号分隔千,保留两个小数

Javascript 正则表达式用逗号分隔千,保留两个小数,javascript,jquery,regex,Javascript,Jquery,Regex,我最近在回答另一个StackOverflow问题时提出了这个代码。基本上,在blur上,这段代码将正确地用逗号分隔千位,并将小数保留为两位数字(如USD的书写方式[7745.56]) 我想知道是否有更简洁的方法使用regex来分隔和截断过多的小数位数。我最近用我最近的尝试更新了这篇文章。有没有更好的方法来处理正则表达式 输入->目标输出 当前正则表达式 var结果; var str=[] reg=新的RegExp(/(\d*(\d{2}\)|\d{1,3})/,“gi”); reversed=

我最近在回答另一个StackOverflow问题时提出了这个代码。基本上,在blur上,这段代码将正确地用逗号分隔千位,并将小数保留为两位数字(如USD的书写方式[7745.56])

我想知道是否有更简洁的方法使用regex来分隔和截断过多的小数位数。我最近用我最近的尝试更新了这篇文章。有没有更好的方法来处理正则表达式

输入->目标输出 当前正则表达式
var结果;
var str=[]
reg=新的RegExp(/(\d*(\d{2}\)|\d{1,3})/,“gi”);
reversed=“9515321312.2323432”。拆分(“”)。反向()连接(“”)
而(结果=注册执行(反向)){
str.push(结果[2]?结果[2]:结果[0])
}
console.log(str.join(“”,“”).split(“”.reverse().join(“”).replace(“”,.“,”)
尝试:

产出:

5,812,090,285.28
注意:
.toFixed(2)
返回一个
字符串
。因此,为了进一步简化此过程,必须添加一种方法,在执行正则表达式之前将
n
转换为
字符串。例如:

n.toString.replace(/(\d)(?=(\d{3})+\.)/g, '$1,');  //ofc with the additional regex

尽管您认为在javascript中这无关紧要,但在这种情况下显然是这样的。所以我不知道不使用它会“少”多少麻烦。

这里有一种不用正则表达式的方法:

value.toLocaleString("en-US", { maximumFractionDigits: 2 })
函数formatValue(){
var source=document.getElementById(“source”);
var output=document.getElementById(“输出”);
var值=parseFloat(source.value);
output.innerText=value.toLocalString(“en-US”{maximumFractionDigits:2});
}

格式

我添加了另一层,其中regex将不需要的小数放在regex逗号添加逻辑的百分之一以下

val.replace(/(\.\d{2})\d*/, "$1").replace(/(\d)(?=(\d{3})+\b)/g, "$1,")
doIt(“7456”);
doIt(“45345”);
doIt(“25.23523534”);
doIt(“3333.239”);
doIt(“234.99”);
doIt(“2300.99”);
doIt(“23123.22”);
doIt(“5812090285.2817481974897”);
函数doIt(val){
log(val+“->”+val.replace(/(\.\d{2})\d*/,“$1”).replace(/(\d)(?=(\d{3})+\b)/g,“$1”);
}
RegEx再次救援

我的解决方案有两部分:

.toFixed
:用于限制小数限制

/(\d)(?=(\d\d\d)+(?!\d))/g
:它使用一次三位数的反向引用

以下是所有内容:

// .toFixed((/\./g.test(num)) ? 2 : 0) it tests if the input number has any decimal places, if so limits it to 2 digits and if not, get's rid of it altogether by setting it to 0
num.toFixed((/\./g.test(num)) ? 2 : 0).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,"))
你可以在这里看到它的作用:

var输入=[74564534525.235235343333.239234.992300.9923123.22]
input.forEach(函数(num){
$(“div”)
.附加(
$('')。文本(num+'=>'+
num.toFixed((/\./g.test(num))?2:0)。替换(/(\d)(?=(\d\d\d)+(?!\d))/g,“$1”)
);
});

您可以这样做

(parseFloat(num).toFixed(2)).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,").replace(".00","")
这里只需将数字转换为格式数字,四舍五入到小数点后2位,然后删除.00(如果存在)

这可能是您可以使用的一种方法

var格式=函数(num){
return(parseFloat(num).toFixed(2)).replace(/(\d)(?=(\d{3})+(?!\d))/g,“$1”).replace(.00,”)
}
$(函数(){
$(“#principalAmtOut”).blur(函数(e){
$(this.val)(格式($(this.val()));
});
});

我根据@Pierre的答案找到了一个解决方案,而没有使用
toFixed

函数格式(n){
n=+n;
var d=数学四舍五入(n*100)%100;
返回(数学层(n)+'')。替换(/(\d)(?=(\d{3})+$)/g,'$1')+(d>9?'.+d:d>0?'.0'+d:'');
}
控制台日志(格式(7456));
console.log(格式(7456.0));
console.log(格式(7456.1));
console.log(格式(7456.01));
控制台日志(格式(7456.001));
console.log(格式(45345));
console.log(格式(25.23523534));
console.log(格式(3333.239));
console.log(格式(234.99));
console.log(格式(2300.99));
console.log(格式(23123.22));

console.log(格式('23123.22'))作为正则表达式的替代方法,您可以使用以下方法

Number(num.toFixed(2)).toLocaleString('en-US')

您仍然可以使用
toFixed(2)
,但它非常干净
toFixed(2)
虽然不会像您希望的那样设置数字。与
{maximumFractionDigits:2}
相同,作为
toLocaleString
的第二个参数

var nums=[74564534525.235235343333.239234.992300.9923123.22]
for(num的var num)
console.log(num'->',Number(num.toFixed(2)).toLocaleString('en-US'))
您可以使用
样式
设置为
“decimal”
最大分数位数
选项处设置为
2
在第二个参数处传递的对象

constnums=[74564534525.235235343333.239234.992300.9923123.22];
const formatOptions={style:“decimal”,maximumFractionDigits:2};
const formatter=新的Intl.NumberFormat(“en-US”,formattoptions);
const formatNums=num=>formatter.format(num);
让formattedNums=nums.map(formatNums);

console.log(格式化nums)
如果您真的坚持只在正则表达式中执行此操作(并截断而不是舍入小数位数),我能想到的唯一解决方案是使用替换函数作为
.replace()
的第二个参数:

这将使您的所有测试用例都通过:

函数格式(num){
返回(“”+num)。替换(
/(\d)(?=(?:\d{3})+(?:\.\124$)\ 124;(\.\ d\d?)\d*$/g,
功能(m、s1、s2){
返回s2 | |(s1+',');
}
);
}
测试(7456,“7456”);
测试(45345,“45345”);
测试(25.23523534,“25.23”)//截断的,不四舍五入的
测试(3333.239,“3333.23”)//截断的,不四舍五入的
测试(234.99,“234.99”);
测试(2300.99,“2300.99”);
测试(23123.22,“23123.22”);
功能测试(num,预期值){
var实际值=格式(num);
console.log(num+'->'+预期+'=>'+实际+':'+
(实际===预期为“已通过”:“失败”)
);

}
我不认为regex是用来添加字符的。所以如果我有
10000.50
你想要
10000.5000
对吗?@Rajesh不,如果我有1000.562343,那么我想要
(parseFloat(num).toFixed(2)).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,").replace(".00","")
Number(num.toFixed(2)).toLocaleString('en-US')
num.toLocaleString('en-US', {maximumFractionDigits: 2})
('' + num).replace(
  /(\d)(?=(?:\d{3})+(?:\.|$))|(\.\d\d?)\d*$/g, 
  function(m, s1, s2){
    return s2 || (s1 + ',');
  }
);