第100题 实现数字千分位格式化

  • 将数字千分位格式化,输出字符串
  • 如输入数字13050100输出13,050,100
  • 注意:逆序判断(从后往前判断)

思路分析

  • 转化为数组,reverse,每三位拆分
  • 使用正则表达式
  • 使用字符串拆分

性能分析

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

划重点

  • 顺序,从尾到头
  • 尽量不要转化数据结构
  • 慎用正则表达式,性能较慢

千分位格式化(使用数组)

    /**
     * 千分位格式化(使用数组)
     * @param n number
     */
    function format1(n) {
      n = Math.floor(n) // 只考虑整数
    
      const s = n.toString() // 13050100
      const arr = s.split('').reverse() // 反转数组逆序判断,从尾到头 00105031
      return arr.reduce((prev, val, index) => {
        // 分析
        // index = 0   prev = ''           val = '0'      return '0'
        // index = 1   prev = '0'          val = '0'      return '00'
        // index = 2   prev = '00'         val = '1'      return '100'
        // index = 3   prev = '100'        val = '0'      return '0,100'
        // index = 4   prev = '0,100'      val = '5'      return '50,100'
        // index = 5   prev = '50,100'     val = '0'      return '050,100'
        // index = 6   prev = '050,100'    val = '3'      return '3,050,100'
        // index = 7   prev = '3,050,100'  val = '1'      return '13,050,100'
        if (index % 3 === 0) { //每隔三位加一个逗号
          if (prev) {
            return val + ',' + prev 
          } else {
            return val
          }
        } else {
          return val + prev
        }
      }, '')
    }

数字千分位格式化(字符串分析)

    /**
     * 数字千分位格式化(字符串分析)
     * @param n number
     */
    function format2(n) {
      n = Math.floor(n) // 只考虑整数
    
      let res = ''
      const s = n.toString() // 13050100
      const length = s.length
    
      //  逆序判断,从尾到头
      //  13050100 length=8
      //  i=7 j=1 res='0'
      //  i=6 j=2 res='00'
      //  i=5 j=3 res=',100'
      //  i=4 j=4 res='0,100'
      //  i=3 j=5 res='50,100'
      //  i=2 j=6 res=',050,100'
      //  i=1 j=7 res='3,050,100'
      //  i=0 j=8 res='13,050,100'
      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
    }
    // 功能测试
    const n = 10201004050
    console.info('format1', format1(n))
    console.info('format2', format2(n))
Last Updated:
Contributors: leeguooooo