2016-04-25 33 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