2013-02-14 36 views
2

這是我的代碼:幹工程符號執行

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。我覺得我重複了很多。上面的代碼可以改進和幹掉嗎?

+1

您可以計算基數10的對數並消除所有的比較。您可以使用數組或對象將指數映射到字母。 – Pointy 2013-02-14 15:07:14

+0

這可能更適合[codereview.stackexchange.com](http://codereview.stackexchange.com/)。 – 2013-02-14 15:07:16

回答

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