题目
- 将数字千分位格式化,输出字符串
- 如输入数字 12050100,输出字符串 12,050,100
- (注意:逆序判断)
常规思路
- 转换为数组,reverse ,每 3 位进行拆分
- 使用正则表达式
- 使用字符串拆分
/**
* @description 数字千分位格式化
* @author lsr
*/
/**
* 数字千分位格式化 - 数组
* @param num 数字
* @returns
*/
export function format1(num: number): string {
const n = Math.floor(num)
const s = n.toString()
const a = s.split('').reverse()
return a.reduce((prev, val, index) => {
if (index % 3 === 0) {
if (prev) {
return val + ',' + prev
} else {
return val
}
} else {
return val + prev
}
}, '')
}
/**
* 数字千分位格式化 - 字符串
* @param num 数字
* @returns
*/
export function format2(num: number): string {
const n = Math.floor(num)
let res = ''
const s = n.toString()
const length = s.length
for (let i = length - 1; i >= 0; i--) {
const j = length - i
if (j % 3 === 0) {
if (i === 0) {
res = s[i] + res
} else {
res = ',' + s[i] + res
}
} else {
res = s[i] + res
}
}
return res
}
// 功能测试
// console.log(format1(12323123445))
// 性能测试
const num = 34534342323423424
console.time('format1')
for (let i = 0; i < 100 * 10000; i++) {
format1(num)
}
console.timeEnd('format1') // 261.371826171875 ms
console.time('format2')
for (let i = 0; i < 100 * 10000; i++) {
format2(num)
}
console.timeEnd('format2') // 167.469970703125 ms
单元测试
/**
* @description 数字千分位格式化
* @author lsr
*/
import { format1, format2 } from '@/01-algorithm/thousands-format'
describe('数字千分位格式化', () => {
it('正常情况', () => {
expect(format2(12323123445)).toBe('12,323,123,445')
})
it('小于1000', () => {
expect(format2(0)).toBe('0')
expect(format2(999)).toBe('999')
})
})
性能分析
- 使用数组,转换影响性能
- 使用正则表达式,性能较差
- 使用字符串,性能较好——推荐答案
划重点
- 顺序:从尾到头
- 尽量不要转换数据结构
- 慎用正则表达式