在Javascript

时间:2016-04-25 18:57:41

标签: javascript

我正在尝试格式化一个以更友好的方式显示的数字。目前,代码很难更新,而且非常庞大且笨拙。

function abb(){
    if(m>=1 && m<999){
        gold_display = m;
    }else if(m>999 && m<999999){
        var b = (m / 1000).toFixed(3);
        gold_display = b+"k";
    }else if (m>999999 && m<999999999){
        var b = (m / 1000000).toFixed(3);
        gold_display = b+"m";
    }else if (m>999999999 && m<999999999999){
        var b = (m / 1000000000).toFixed(3);
        gold_display = b+"b";
    }else if (m>999999999999 && m<99999999999999){
        var b = (m / 1000000000000).toFixed(3);
        gold_display = b+"t";
    }
}

编辑:这将成为代码:

function abb(){
        if(m>=1 && m<1000){
            gold_display = m;
        }else if(m>999 && m<1000000){
            var b = (m / 1000).toFixed(3);
            gold_display = b+"k";
        }else if (m>999999 && m<1000000000){
            var b = (m / 1000000).toFixed(3);
            gold_display = b+"m";
        }else if (m>999999999 && m<1000000000000){
            var b = (m / 1000000000).toFixed(3);
            gold_display = b+"b";
        }else if (m>999999999999 && m<100000000000000){
            var b = (m / 1000000000000).toFixed(3);
            gold_display = b+"t";
        }
    }

是的,这是令人讨厌的,但它是我脑海中唯一的解决方案,有没有办法将其转换为循环并缩小代码?

我正在考虑将数字“k”,“m”,“b”,“t”保存在数组中,因为我想要更高的“q”,“qi”,“s”等。

如果问题有点愚蠢,谢谢,对不起:(

3 个答案:

答案 0 :(得分:2)

1000

之前计算您需要除function bigNumber(big) { let divisor = 1, steps = 0, small = big; while (small >= 1000) { divisor *= 1000; small = big / divisor; ++steps; } return {steps, divisor, small}; } let gold = 123456789, foo = bigNumber(gold); foo.small.toFixed(3) + ['', 'k', 'm', 'b', 't'][foo.steps]; // "123.457m" 次的次数
if else

答案 1 :(得分:1)

这并不多,但是代码的一个简化就是消除下限检查,因为if / else-if结构会处理这个:

function abb(m) {
  if (m < 1) {
    // some kind of error?
  } else if (m < 1000) {
    return m;
  } else if (m < 1000000) {
    return (m/1000).toFixed(3) + "k";
  } else if (m < 1000000000) {
    return (m/1000000).toFixed(3) + "m";
  } else {
    // and so on
  }
}

你可以做一些更聪明的事情,但我认为最好是简单一点。

但是,如果我正确理解你的代码,那么你试图将数字格式化为数千(“k”),数百万(“m”),数十亿(“b”)等等。为什么不看一个这样的库作为http://numeraljs.com/

具体来说,您可以使用以下代码:

var numeral = require('numeral').language('en');

导入numeral.js库,然后使用此代码执行格式化:

var str = numeral(12345678).format("0.0a");// "12.3m"
var str = numeral(1234).format("0.0a");// "1.2k"

答案 2 :(得分:1)

完全公开:这个解决方案带来了for for循环的好处,但确实有一些额外的复杂性。

m的对数。如果1 <= m< 9990 <= exponent < 3。同样,如果是1000 <= m < 999999,那么3 <= exponent < 6,依此类推。你可以在这里看到模式,每个前缀在对数刻度上覆盖3的范围。所以你可以做类似以下的事情:

function abb(m){
    var prefixes = ["","k","m","b","t"];
    var log = Math.log10(m);
    var prefixRange = parseInt(log/3, 10);
    var prefix = prefixes[prefixRange];

    return (m / Math.pow(1000, prefixRange)).toFixed(3) + prefix;
}

实际上,在数字非常大的情况下,上述内容会中断,因此需要将prefixRange = parseInt(log/3, 10)更改为prefixRange = Math.min(parseInt(log/3, 10), 4),以确保我们不会读取超出数组{{1}的长度}}。

另外,请注意,在这种情况下,对于大数字,toFixed实际上并不值得信任。 prefixes给出了999999999 / 1000000,我想这不是你想要的。在这种情况下,最好与地板一起使用。由于您只对第一个数字感兴趣(整数为3,小数部分为3),您可以先获得这6个数字然后除以1000。

解决这两个问题的更好的功能是:

1000.000