【前端手撕】将数字每千分位用逗号隔开

碎碎念

昨天做了一套笔试,感觉挂完了。。

路还长着,慢慢学吧。

题意

将数字每千分位用逗号隔开就是给长数字加"千位分隔符",目的是提高数字的可读性,一眼就能看清这个数有多大。

比如:

  • 1000000 → 格式化后 1,000,000

  • 123456789 → 格式化后 123,456,789

简易版代码

把数字先转成字符串,之后从后往前三位三位处理,用一个数组接收,最后反转数组转回字符串。

javascript 复制代码
const thousandSeparator = (num) => {
    const n = num.toString()// 转为字符串
    let count = 0
    const arr = []
    for (let i = n.length - 1; i >= 0; i--) {
        count++
        if (count < 4) {
            arr.push(n[i])
        } else {
            arr.push(',', n[i])
            count = 1
        }
    }
    return arr.reverse().join('')
}

但上面这个代码只能处理正整数。如果有小数的话小数点也会被当成一个字符参与划分,出现123,456,.78的情况;如果有负号,也会出现-,123,456,789的情况。因此需要做进一步处理。

加强版代码

这里主要就是对数字转完的字符串做一个划分处理,分出"符号、整数、小数"三部分,其中对整数的处理和上面是一样的,最后拼接起来即可。

javascript 复制代码
// 改进版 可以处理负数和小数点
const thousandSeparator2 = (num) => {
    // 转为字符串
    let n = num.toString()
    let sign = ''

    // 处理负数
    if (n.startsWith('-')) {
        sign = '-'
        n = n.slice(1) // 去掉负号
    }

    // 拆分整数部分和小数部分
    const parts = n.split('.')
    const intPart = parts[0]
    const decPart = parts[1] || ''

    // 处理整数部分,添加千分位逗号
    let count = 0
    const arr = []
    for (let i = intPart.length - 1; i >= 0; i--) {
        count++
        if (count < 4) {
            arr.push(intPart[i])
        } else {
            arr.push(',', intPart[i])
            count = 1
        }
    }

    const formattedInt = arr.reverse().join('')
    return sign + formattedInt + (decPart ? '.' + decPart : '')
}

测试

javascript 复制代码
console.log(thousandSeparator2(1234567890.123456))
console.log(thousandSeparator(1234567890))

测试结果: