2016-04-25 49 views
1

我试图格式化数字以更友好的方式显示。目前,代码很难更新,而且非常笨拙。将巨大的if else语句转换为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"; 
    } 
} 

编辑:这将是CODE:

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"; 
     } 
    } 

没错这就是akward的,但它是想出了在我的心里唯一的解决办法,有没有办法将它转换成一个循环,缩小代码?

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

感谢和抱歉,如果这个问题是有点笨:(

+0

阵列最大/最小/除数,然后在它循环? –

+0

请注意'if(x <10)... else if(x> 10)'不能识别case == x === 10' –

+0

Thanks @PaulS。更新了上面的代码! –

回答

2

算你需要多少次1000你正在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" 
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" 

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),以确保我们不会读取超出长度数组prefixes

此外,请注意,在这种情况下,toFixed在大数字中并不真正值得信任。 999999999/1000000给出1000.000,我猜这不是你想要的。在这种情况下,最好用地板倒圆角。由于您只对第一个数字感兴趣(3为整数,3为小数部分),您可以先获得这6位数字,然后除以1000。

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

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

    return Math.floor((m/Math.pow(1000, prefixRange - 1)))/1000 + prefix; 
} 
+0

优秀的答案佩德罗!用四舍五入来指出问题尤为重要。 – Roberto