金额保留n位小数,及保留方式

金额保留n位小数,及计算方式(从保留位数后面开始计算,不使用千分位分隔符****

前端工作中经常遇到数字计算保留小数问题,由于不是四舍五入的方式不能使用toFixed函数,本文采用正则表达式匹配字符串的方式,解决对数字的向上或向下保留小数问题:
向上取整或向下取整从保留小数位开始处理数据

  • 参数
参数 类型 默认 注释
s string/Number 金额
n string/Number 2 保留小数位数
method string/Number 0 传入计算方式四色五入传0,向下取整传2,向上取整传1
AMONTDECIMAL(s,n=2,method=0) {
  // 保留方案:四色五入,向下取整,向上取整......
  if(method===0) {//四色五入
    s = parseFloat((s + "").replace(/[^\d\.-]/g, "")).toFixed(n) + ""; //四舍五入replace处理出现多次.的问题
    return s
  } else if (method===1) {//向上取整
    // a为原数字,n是保留的小数位数
    let result = '0'
    if (Number(s) && n > 0) { // 简单的做个判断
      n = +n || 2
      s = s + ''
      if (/e/.test(s)) { // 如果是包含e字符的数字直接返回
        result = s
      } else if (!/\./.test(s)) { // 如果没有小数点
        result = s + `.${Array(n + 1).join('0')}`
      } else { // 如果有小数点
        s =s + `${Array(n + 1).join('0')}`
        let reg = new RegExp(`-?\\d*\\.\\d{0,${n}}`)
        let floorStr = reg.exec(s)[0]
        if (+floorStr >= +s) {
          result = floorStr
        } else {
          let floorNumber = +floorStr + +`0.${Array(n).join('0')}1`
          let point = /\./.test(floorNumber + '') ? '' : '.'
          let floorStr2 = floorNumber + point + `${Array(n + 1).join('0')}`
          result = reg.exec(floorStr2)[0]
        }
      }
    }
    return result
  } else if (method===2) {//向下取整
    // s为原数字,n是保留的小数位数
    let result = '0'
    if (Number(s) && n > 0) { // 简单的做个判断
      n = +n || 2
      s = s + ''
      if (/e/.test(s)) { // 如果是包含e字符的数字直接返回
        result = s
      } else if (!/\./.test(s)) { // 如果没有小数点
        result = s + `.${Array(n + 1).join('0')}`
      } else { // 如果有小数点
        s = s + `${Array(n + 1).join('0')}`
        let reg = new RegExp(`-?\\d*.\\d{0,${n}}`)
        result = reg.exec(s)[0]
      }
    }
    return result
  }
}

你可能感兴趣的:(js,js,正则表达式,字符串)