这种在面试中常考的题我们也需要掌握,首先拿到一串数字,看最直观的方式
function formatNumber(str) {
let arr = [],
count = str.length
while (count >= 3) {
arr.unshift(str.slice(count - 3, count))
count -= 3
}
// 如果是不是3的倍数就另外追加到上去
str.length % 3 && arr.unshift(str.slice(0, str.length % 3))
return arr.toString()
}
console.log(formatNumber("1234567890")) // 1,234,567,890
这种方式很''直白'',不过确实有效
function formatNumber(str) {
// ["0", "9", "8", "7", "6", "5", "4", "3", "2", "1"]
return str.split("").reverse().reduce((prev, next, index) => {
return ((index % 3) ? next : (next + ',')) + prev
})
}
console.log(formatNumber("1234567890")) // 1,234,567,890
这种方式就是需要对 JavaScript 的 API 玩的非常好了,有点惊艳的感觉
function formatNumber(str) {
return str.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
}
console.log(formatNumber("123456789")) // 1,234,567,890
我们通过正则表达式非常精简的得到了结果,但是不是那么容易懂,需要对正则比较熟悉,下面简单分析下正则/\B(?=(\d{3})+(?!\d))/g
:
/\B(?=(\d{3})+(?!\d))/g
: 正则匹配边界\B
,边界后面必须跟着(\d{3})+(?!\d)
;(\d{3})+
: 必须是一个或多个的3位数字;(?!\d)
:第二步中的三位数字后面不允许跟数字;(\d{3}+(?!\d))
:所有匹配的边界后面必须跟着3*n
的数字
最终把匹配到的所有边界换成,
即可达成目标。
还有一种更简单易懂的方式,那就是 toLocaleString
(123456789).toLocaleString('en-US') // 1,234,567,890
更多 toLocaleString
好玩的用法可以自己试试