实现数字的千分位逗号分割
方案一:数组循环
function thousands(num) {
var result = [], counter = 0;
num = (num || 0).toString().split('');
for (var i = num.length - 1; i >= 0; i--) {
counter++;
result.unshift(num[i]);
if (!(counter % 3) && i != 0) { result.unshift(','); }
}
console.log(result.join(''));
}
thousands(314159265354)
方案二:字符串循环
直接获取字符串下标,不需要转数组
function thousands(num) {
var result = '', counter = 0;
num = (num || 0).toString();
for (var i = num.length - 1; i >= 0; i--) {
counter++;
result = num.charAt(i) + result;
if (!(counter % 3) && i != 0) { result = ',' + result; }
}
console.log(result);
}
thousands(314159265354)
方案三:字符串不循环
直接根据截取
function thousands(num) {
var num = (num || 0).toString(), result = '';
while (num.length > 3) {
result = ',' + num.slice(-3) + result;
num = num.slice(0, num.length - 3);
}
if (num) { result = num + result; }
console.log(result);
}
thousands(314159265354)
方案四:正则
function thousands(num) {
var num = (num || 0).toString(), reg = '/\d{3}$/', result = ''; //匹配三个数字字符
while (reg.test(num) ) {
result = RegExp.lastMatch + result;//返回上一次正则表达式搜索过程中最后一个匹配的文本字符串。
if (num !== RegExp.lastMatch) {
result = ',' + result;
num = RegExp.leftContext;//返回上一次正则表达式匹配时,被搜索字符串中最后一个匹配文本之前(不包括最后一个匹配)的所有字符。
} else {
num = '';
break;
}
}
if (num) { result = num + result; }
console.log(result);
};
thousands(314159265354)
方案五:升级版正则
function thousands(num) {
// \B 匹配非单词边界,匹配位置的左右两边都是 \w([a-zA-Z0-9_])
// ?=是先行断言,表示这个位置后面的内容需要满足的条件,注意只是匹配一个位置,并不匹配具体的字符,所以是零宽;
// ?!后行断言,表示这个位置后面的内容不能满足的条件,(?!\d)表示接下来的位置不是数字,可以是小数点
// \d{3}匹配三个数字,+表示前面的内容重复1到多次,也就是匹配3个数字一到多次,3的倍数字符串
// (?=(\d{3})+(?!\d))匹配一个位置,这个位置后面首先是3的倍数个数字的字符串,接下来的位置不是数字
console.log(num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","));
}
thousands(314159265354.99)
方案六:凑整法
function thousands(num) {
var num = (num || 0).toString(), temp = num.length % 3;
switch (temp) {
case 1:
num = '00' + num;
break;
case 2:
num = '0' + num;
break;
}
console.log (num.match(/\d{3}/g).join(',').replace(/^0+/, ''));
}
thousands(314159265354)
方案七:toLocaleString
var num = 123456789
//格式化千分位输出
num.toLocaleString()
//格式化为千分位带$符号输出
num.toLocaleString("en-US",{style:"currency",currency:"USD"})
//格式化为带¥符号输出
num.toLocaleString("zh-Hans-CN",{style:"currency",currency:"CNY"})