3

这是我的代码:

function engineeringNotation(number) {
    var space = ' ';

    // Giga
    if(number >= 1e10)
        return (number / 1e9).toFixed(1) + space + 'G';
    else if(number >= 1e9)
        return (number / 1e8).toFixed(0) / 10 + space + 'G';

    // Mega
    else if(number >= 1e7)
        return (number / 1e6).toFixed(1) + space + 'M';
    else if(number >= 1e6)
        return (number / 1e5).toFixed(0) / 10 + space + 'M';

    // Kilo
    else if(number >= 1e4)
        return (number / 1e3).toFixed(1) + space + 'k';
    else if(number >= 1e3)
        return (number / 1e2).toFixed(0) / 10 + space + 'k';

    // Unit
    else if(number >= 1e1)
        return (number / 1e0).toFixed(0) + space + '';
    else
        return (number / 1e-1).toFixed(0) / 10 + space + '';
}

基本上,它需要一个数字,并以“工程符号”将其返回到小数点后一位。例如,1234变成1.2 k。我觉得我在重复自己很多。上面的代码可以改进和干燥吗?

4

1 回答 1

2

只是实现(一些)Pointy 的想法,这不是最优化的方法,但它应该让你开始。

function engineeringNotation(number) {
    var unitMap = {G:1e9,M:1e6,k:1e3};
    var space = ' ';
    for(var unit in unitMap) {
        if(unitMap.hasOwnProperty(unit)) {
            if(number >= unitMap[unit]*10) {
                return (number / unitMap[unit]).toFixed(1) + space + unit;
            }
            if(number >= unitMap[unit]) {
                return (number / unitMap[unit]/10).toFixed(0) / 10 + space + unit;
            }
        }
    }
}
于 2013-02-14T16:04:54.443 回答