Excel数字格式转换方法

/*
 * 格式化数字显示方式
 * 规则:
 * #代表占位符,不足不补0,0代表占位符,不足补0,进位按照四舍五入原则
 * 用法:
 * formatNumber(12345.999,'#,##0.00');
 * formatNumber(12345.999,'#,##0.##');
 * formatNumber(123,'000000');
 * @param num
 * @param pattern
 */
export function formatNumber(num: number, pattern: string) {
  const fmtarr = pattern ? pattern.split('.') : ['']; // 格式化字串转为数组
  // 四舍五入处理
  const decimals = fmtarr.length > 1 ? fmtarr[1].length : 0; // 小数位
  num = Math.round(num * Math.pow(10, decimals)) / Math.pow(10, decimals);

  const strarr = num ? num.toString().split('.') : ['0']; // 值->字符串->数组
  let retstr = '';

  // 整数部分
  let str = strarr[0];
  let fmt = fmtarr[0];
  let i = str.length - 1;
  let comma = false;
  for (let f = fmt.length - 1; f >= 0; f--) {
    switch (fmt.substr(f, 1)) {
      case '#':
        if (i >= 0) {
          retstr = str.substr(i--, 1) + retstr; // 加当前字符
        }
        break;
      case '0':
        if (i >= 0) {
          retstr = str.substr(i--, 1) + retstr; // 加当前字符
        } else {
          retstr = '0' + retstr; // 补0
        }
        break;
      case ',':
        comma = true; // 有千位符
        retstr = ',' + retstr; // 直接加上逗号(,)
        break;
    }
  }
  // 整数字符串替换格式后剩余字符串处理
  if (i >= 0) {
    if (comma) {
      const l = str.length;
      for (; i >= 0; i--) {
        retstr = str.substr(i, 1) + retstr;
        if (i > 0 && (l - i) % 3 === 0) {
          retstr = ',' + retstr; // 加上千位符
        }
      }
    } else {
      retstr = str.substr(0, i + 1) + retstr; // 无千位符直接加在前面
    }
  }

  retstr = retstr + '.';
  // 处理小数部分
  str = strarr.length > 1 ? strarr[1] : '';
  fmt = fmtarr.length > 1 ? fmtarr[1] : '';
  i = 0;
  for (let f = 0; f < fmt.length; f++) {
    switch (fmt.substr(f, 1)) {
      case '#':
        if (i < str.length) {
          retstr += str.substr(i++, 1); // 加当前字符
        }
        break;
      case '0':
        if (i < str.length) {
          retstr += str.substr(i++, 1); // 加当前字符
        } else {
          retstr += '0'; // 补0
        }
        break;
    }
  }

  // 返回
  // 1.去掉开头的逗号(,)和加号(+);2.结尾的小数点(.)
  return retstr.replace(/^,+/, '').replace(/\.$/, '');
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值