JavaScript:将数字字符串处理为任何自己想要的格式

最近项目中有这样需求,将一个数字字符串处理为需要的格式,比如:

var num = 0.431 // 处理为0.44
var num2 = 1.998 // 处理为2.00
复制代码

所以我就想有没有这样一个办法,将一个数字字符串转为任何我想要的数字格式,JavaScript的字符串、数字处理的相关方法想了一遍,貌似都不支持这种处理(支持处理为整数或者浮点数,支持进一位、四舍五入或者截取为任意位数)

思考后写了以下的处理方法,如有不妥,还请指正

/**
* @param {string|number} num 要处理的数字字符串或者数字本身
* @param {number} decimalPlace 要保留的小数位数
* @param {number} 处理数据类型 1 向上取整 2 向下取整  默认四舍五入
* @returns {string} 返回处理后的数字字符串
*/
function getFixVal(num, decimalPlace, dealState) {
  // 若传入的不是数字格式,则不处理
  if (isNaN(parseFloat(num))) {
    return false;
  }

  let sNum = num + '';
  const idx = sNum.indexOf('.');

  // 若处理的数据类型为默认的四舍五入,则直接取用toFixed函数的处理结果
  if (!dealState || (dealState != 1 && dealState != 2) || idx === -1) {
    return parseFloat(num).toFixed(decimalPlace);
  }

  const arrNum = sNum.split('.');
  let decimalNum = arrNum[1]; // 获取小数位的数字
  let integerPart = arrNum[0];

  // 若要求的小数位数大于0,则返回整数部分加上处理之后的小数部分,否则返回整数.
  if (decimalPlace > 0) {
    let isAdd = false; // 向上取整是否需要进一位

    // 若小数位数字位数已经大于要保留的位数,则做以下处理
    if (decimalNum.length > decimalPlace) {
      let front = decimalNum.substring(0, decimalPlace);
      let end = decimalNum.substring(decimalPlace, decimalPlace + 1);

      // 若向上取整,则小数点后数字在原有基础上加1
      switch (dealState) {
        case 1:
          if (parseInt(end) > 0) {
            let temp = (parseInt(front) + 1) / Math.pow(10, decimalPlace);
            // 若无需进位,如98 + 1 = 99  99 / 100 = 0.99,则截取小数点后两位
            if (temp < 1) {
              decimalNum = (temp + '').substring(2, decimalPlace + 2);
              if (decimalNum.length < decimalPlace) decimalNum = decimalNum.padEnd(decimalPlace, '0');
            } else {
              decimalNum = ''.padEnd(decimalPlace, '0');
              isAdd = true;
            }
          }
          break;
        default:
          decimalNum = front;
      }
    } else {
      decimalNum = decimalNum.padEnd(decimalPlace, '0')
    }
    if (isAdd) integerPart = parseInt(integerPart) + 1;
    return integerPart + '.' + decimalNum.substring(0, decimalPlace); // 再次substring是因为有精度问题
  } else {
    // 若要求处理为整数,做以下处理
    switch (dealState) {
      case 1:
        sNum = Math.ceil(num) + '';
        break;
      default:
        sNum = Math.floor(num) + '';
    }
    return sNum;
  }
}

复制代码

发现了一篇更详细的处理js浮点数精度问题的文章

JS中浮点数精度问题

转载于:https://juejin.im/post/5c23594be51d4541d80743ae

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值