输入一个数值,符合条件时,输出带万,亿,万亿单位的字符串

需求:传入一个数n,输出一个字符串s
要求:

  1. n>=1e4 以万做单位,亿, 万亿同理
  2. 保留两位小数

举例:
n = 11100;
则: 输出s等于1.11万

我的写法:

function ConvertNum () {
  let _tmpArg = [10000 * 10000 * 10000, 10000 * 10000, 10000];
  let moneyUnits = ["万亿", "亿", "万"];
  //转换数字
  let str_curNum = num.toString();

  for (let i = 0, l = _tmpArg.length; i < l; i++) {
    let _tmp = _tmpArg[i];
    if (num >= _tmp) {
      let ss_ = Math.floor(num / _tmp); //整数部分
      let ss = Math.floor(num % _tmp / (_tmp / 100));
      if (ss == 0) {
        str_curNum = ss_ + moneyUnits[i];
      } else {
        str_curNum = ss_ + '.' + Utils.getNumStr(ss) + moneyUnits[i];
      }
      break;
    }
  }
  return str_curNum;
}

各位大佬,求最优解

阅读 5.6k
2 个回答
const convert = n => n.toFixed(0).replace(/(\d{1,4})((\d{4})*)$/, (a, b, c) => {
  const t = ["", "万", "亿", "万亿"][c.length / 4]
  return t ? `${b}.${c.slice(0,2)}${t}` : b
})

image.png

我看见网上有个其他的解答:

// 数字转换
    var numberFormat = function (value) {
            var param = {};
            var k = 10000,
                sizes = ['', '万', '亿', '万亿'],
                i;
                if(value < k){
                    param.value =value
                    param.unit=''
                }else{
                    i = Math.floor(Math.log(value) / Math.log(k)); 
              
                    param.value = ((value / Math.pow(k, i))).toFixed(2);
                    param.unit = sizes[i];
                }
        return param;
    }
    console.log(numberFormat(15222256.33))
//原文链接:https://blog.csdn.net/namechenfl/article/details/91968396

附上两个方式的执行结果(以时间作对比)
image.png

========更新-分割线======================

/**
 * @description: 输入一个数值,当条件满足时,返回一个带计量单位的字符串
 * @param {num} 具体数值 Number
 * @param {place} 保留小数点位数 Number
 * @return: String
 */
function ConvertNum(num) {
    //let p = /^[0-9]+?$/.test(place) ? place : 2;
    //小数点位数
    let _ws = Math.pow(10, 2);
    //基础单位值
    let _b = 1e4;
    //小于最低值,直接返回
    if (num < _b) {
        return num.toString();
    }
    //返回值
    let _r = '';

    //计量单位数组
    //let _strArg = ['万亿', '亿', '万', ''];
    // let _numArg = [1e12, 1e8, 1e4];
    // for (let i = 0, l = _numArg.length; i < l; i++) {
    //   let _t = _numArg[i];
    //   if (num >= _t) {
    //     let _z = Math.floor(num / _t * _ws)/_ws;
    //     let _w = _strArg[i];//计量单位
    //     _r = _z + _w;
    //     break;
    //   }
    // }

    let _strArg = ['', '万', '亿', '万亿'];
    let _i = Math.floor(Math.log(num) / Math.log(_b));
    if (_i > 3) {
        _i = 3;
    }
    _r = Math.floor(num / Math.pow(_b, _i) * _ws) / _ws + _strArg[_i];
    return _r;
}

//测试
//百万次执行
console.time('a');
for (let i = 0; i < 1000000; i++) {
    let n = Math.floor(Math.random()*(1e12 - 1  + 1) + 1);
    ConvertNum(n)
}
console.timeEnd('a');
//a: 367.76171875ms
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题