普通数字转换成带逗号的数字

484 阅读3分钟

最近开发项目遇到把普通数字转换成带逗号数字的需求, 现在分享一种思路, 供大家参考

注意: 入参应为纯数字或数字类型字符串

思路: 在开发前需要确定数字的位数, 根据不同情况改造


先使用includes方法判断数字为整数还是小数


整数思路

整数会出现的数字: 1 | 12 | 123 | 1234 | 12345 | 123456 | 1234567

  1. 确定数字长度: 将数字转换成字符串取长度
  2. 当数字长度 <= 3 不需要添加逗号,直接输出原数字
  3. 当数字长度 > 3 数字进行添加逗号的改造:
  • 情况一 : 第一个逗号前是小于3位的数

使用数字长度 % 3 取余, 如果结果不是0 说明第一个逗号前有小于三位的数字 例如 1234, 余数用于单独获取第一个逗号左右的数字.

获取到第一个逗号右侧的数字后, 判断右侧数字位数, 分为三位数 和大于三位数 例如 123 | 123123, 如果右侧数字只有3位,那么返回第一个逗号左侧的数 + ',' + 逗号右侧数;

如果右侧数字多于3位,需要在右侧数字内添加逗号,方法:

  1. 最终返回数 = 左侧数字
  2. 获取右侧数字长度
  3. 长度 / 3 获得循环次数
  4. 根据循环次数每次取三位数: 例如 123456 会循环两次, 第一次取123 第二次456, 将每次循环的数字追加到一个新的数组中
  5. 得到了数组, 使用map, 每拿一项就改变一次最终返回数 最终返回数 = 最终返回数 + ',' + 该项的值

===============

  • 情况二 : 第一个逗号前不是小于3位的数

使用数字长度 % 3 取余, 如果结果是0 说明第一个逗号前没有小于三位的数字, 例如 123 | 123123, 这种情况只需要将数字用上面的方法以3位为一组拆开, 最终使用逗号拼接, 需要注意的是拼接的数字最终会出现 ,123,123的情况, 需要清除字符串的第一位


小数思路

小数会出现的数字: 1.1 | 12.1 | 123.1 | 1234.1 | 12345.1 | 123456.1 | 1234567.1

  • 首先和使用 . 将小数拆分, 拿整数位操作
  • 整体思路和整数一样
  • 需要注意的是最终的值要加上 '.' 与 小数位

具体代码如下

setNumSty (num) {
  const numString = num + ''
  const LEN = numString.length
  let integer = ''
  let decimal = ''
  let numArr = []
  var returnNum = '' // 添加逗号后最终数字
  // 先判断是否为小数
  if (numString.includes('.')) {
    // 小数
    numArr = numString.split('.') // 从小数点切割数字

    integer = numArr[0] + '' // 整数部分
    decimal = numArr[1] + '' // 小数部分
    const len = integer.length // 整数位数

    let n1 = ''
    let n2 = ''
    if (len <= 3) { // 整数位不携带逗号
      returnNum = num
    }
    if (len > 3) { // 整数位携带逗号
      if (len % 3 === 0) { // 第一个逗号前无小于3位数字
        if (len / 3 === 1) { // 数字以3为一组拆分
          returnNum = integer + '.' + decimal
        } else {
          n1 = integer + '' // 第一个逗号之前的数
          if (n1.length === 3) { // 以三个数为一组添加逗号
            returnNum = n1 + '.' + decimal
          } else {
            const threes = n1.length / 3
            const n2 = []
            for (let i = 0; i < threes; i++) {
              n2.push(n1.slice(i * 3, i * 3 + 3))
            }
            n2.map(n => {
              returnNum = returnNum + ',' + n
            })
            returnNum = (returnNum + '.' + decimal).substring(1)
          }
        }
      } else { // 第一个逗号前有小于3位数字
        n1 = integer.slice(0, len % 3) + '' // 第一个逗号之前的数
        n2 = integer.slice(len % 3) + '' // 第一个逗号之后的数
        if (n2.length === 3) { // 以三个数为一组添加逗号
          returnNum = n1 + ',' + n2 + '.' + decimal
        } else {
          returnNum = n1
          console.log('returnNum', returnNum)
          const threes = n2.length / 3
          const n3 = []
          for (let i = 0; i < threes; i++) {
            n3.push(n2.slice(i * 3, i * 3 + 3))
          }
          console.log('n3', n3)
          n3.map(n => {
            returnNum = returnNum + ',' + n
          })
          returnNum = returnNum + '.' + decimal
        }
      }
    }
  } else {
    // 整数
    if (LEN <= 3) {
      returnNum = num
    } else {
      integer = numString
      if (LEN % 3 === 0) { // 第一个逗号前无小于3位数字
        const n1 = []
        for (let i = 0; i < integer.length / 3; i++) {
          n1.push(integer.slice(i * 3, i * 3 + 3))
        }
        n1.map(n => {
          returnNum = returnNum + ',' + n
        })
        returnNum = returnNum.substring(1)
      } else { // 第一个逗号前有小于3位数字
        const n1 = numString.slice(0, LEN % 3) // 第一个逗号之前的数
        const n2 = numString.slice(LEN % 3) + '' // 第一个逗号之后的数
        returnNum = n1
        if (n2.length <= 3) { // 第一个逗号后没有逗号
          returnNum = n1 + ',' + n2
        } else { // 第一个逗号后有逗号
          const n3 = []
          const len2 = n2.length / 3

          for (let i = 0; i < len2; i++) { // 三位数为一组拆分
            n3.push(n2.slice(i * 3, i * 3 + 3))
          }
          n3.map(n => {
            returnNum = returnNum + ',' + n
          })
        }
      }
    }
  }
  return returnNum
  }

调用时将要转换的数字作为入参传入setNumSty方法即可