参考答案

方案一:数组循环

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"})