算法题:数字千分位格式化

题目

  • 将数字千分位格式化,输出字符串
  • 如输入数字 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')
  })
})

性能分析

  • 使用数组,转换影响性能
  • 使用正则表达式,性能较差
  • 使用字符串,性能较好——推荐答案

划重点

  • 顺序:从尾到头
  • 尽量不要转换数据结构
  • 慎用正则表达式
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值