方法一:使用正则表达式实现
function formatNum(num) {
return num &&
num.toString()
.replace(
/\d{1,3}(?=(\d{3})+\.)/g,
"$&,");
}
formatNum(1234567.890);
=> 1,234,567.89
\d{1,3}(?=(\d{3})+\.)
表示在 .
前面的数字,开头有1-3个数字,后面至少由一组3个数字结尾
?=
为正向肯定查找,其可以作为匹配的条件,但匹配到的内容不获取,并且作为下一次查询的开始
$&
表示与正则表达式相匹配的内容
方法二:常规想法
function formatNum(num){
num +=''; // 数字转字符串
var str = "", // 字符串累加
beginDot, // 小数点开始的地方
dot = num.indexOf("."), // 是否有小数点
endStr = ""; // 小数点之后的内容
if(dot != -1) {
beginDot = num.indexOf(".");
endStr = num.slice(beginDot);
}
for(var i = (dot != -1) ? beginDot - 1 : num.length - 1, j = 1; i >= 0; i--, j++){
if(j%3 == 0 && i != 0){//每隔三位加逗号,过滤正好在第一个数字的情况
str += num[i] + ",";//加千分位逗号
continue;
}
str += num[i];//倒着累加数字
}
return str.split('').reverse().join("") + endStr;
}
formatNum(1234567.890);
=> 1,234,567.89