碎碎念
昨天做了一套笔试,感觉挂完了。。
路还长着,慢慢学吧。
题意
将数字每千分位用逗号隔开就是给长数字加"千位分隔符",目的是提高数字的可读性,一眼就能看清这个数有多大。
比如:
-
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))
测试结果:
