2017-04-22 45 views
1

。我有一個空閒的答題遊戲,你可以單擊美元鈔票並獲得金錢和升級等我剛剛創建了一個abbreviateNumber功能它縮短了價值1000到1K,1M,1T等我複製它關閉此一主題:Convert long number into abbreviated string in JavaScript, with a special shortness requirement,但我不知道如何與2位小數,而不是僅僅1中,如顯示1.05k,2.65米等

我會很感激,如果有人可以幫助我,所以我可以在我的編碼進行比賽,我abbreviateNumber功能如下:

function abbreviateNumber(value) { 
    var newValue = value; 
    if (value >= 1000) { 
     var suffixes = ["", "k", "m", "b","t"]; 
     var suffixNum = Math.floor((""+value).length/3); 
     var shortValue = ''; 
     for (var precision = 2; precision >= 1; precision--) { 
      shortValue = parseFloat((suffixNum != 0 ? (value/Math.pow(1000,suffixNum)) : value).toPrecision(precision)); 
      var dotLessShortValue = (shortValue + '').replace(/[^a-zA-Z 0-9]+/g,''); 
      if (dotLessShortValue.length <= 2) { break; } 
     } 
     if (shortValue % 1 != 0) shortNum = shortValue.toFixed(1); 
     newValue = shortValue+suffixes[suffixNum]; 
    } 
    return newValue; 
} 
+1

_ 「我剛剛創建了一個abbreviateNumber功能」 _/_「我複製它關閉此一主題」 _這兩個語句是在同一個另一個優勢。此外,你不應該執行你不明白的代碼。 –

回答

2

您可以使用對數和.toFixed()實現在短短的幾行此功能(在你那裏甚至不正確地確定數字大小功能):

var suffixes = ['', 'k', 'm', 'b', 't', 'qd', 'qt', 'sx', 'sp', 'o', 'n', 'd']; 
 
var log1000 = Math.log(1000); 
 

 
function abbrevNum(num, decimalPlaces) { 
 
    if (num < 0) { return '-' + abbrevNum(-num, decimalPlaces); } 
 
    if (num < 1000) { return num.toFixed(decimalPlaces); } 
 

 
    var magnitude = Math.min(Math.floor(Math.log(num)/log1000), suffixes.length - 1); 
 
    var adjusted = num/Math.pow(1000, magnitude); 
 

 
    return adjusted.toFixed(decimalPlaces) + (suffixes[magnitude] || ''); 
 
} 
 

 
console.log(abbrevNum(1323457, 2)); 
 
console.log(abbrevNum(13357, 2)); 
 
console.log(abbrevNum(0, 2)); 
 
console.log(abbrevNum(0.456, 2)); 
 
console.log(abbrevNum(-23456, 2)); 
 
console.log(abbrevNum(7.567e20, 2)); 
 
console.log(abbrevNum(9.23456e28, 2)); 
 
console.log(abbrevNum(8.235926e37, 2));

+0

嘿,很好的代碼。我將如何使用這個函數的變量。我使用它如下:document.getElementById('balance')。value =「$」+(abbrevNum(balance,2));但是當它更新並顯示平衡時,它說:$ NaNundefined你知道這是爲什麼嗎? –

+0

@DavidLunt你應該能夠像這樣傳遞變量,如果它包含一個數字。如果它擁有一個字符串,你需要做的'「$」 + abbrevNum(編號(平衡),2)' – JLRishe

+0

@JSRishe太感謝了,它現在的工作:-)原來這是一個字符串,所以你的方法轉換成數字:-)工作 –

-2

您正在尋找的標準JavaScript方法.toFixed

var n = 1.4 
n.toFixed(2) 

產生 「1.40」。而且,雖然您沒有要求審覈,但該代碼潦草難懂。關於如何:

const formatter = (suffix, divisor) => n => (n/divisor).toFixed(2) + suffix; 
 
const forms = [ 
 
    n => n.toFixed(2), 
 
    formatter("k", 1000), 
 
    formatter("m", 1000000), 
 
    formatter("b", 1000000000), 
 
    formatter("t", 1000000000000), 
 
]; 
 
const zeros = n => n && Math.floor(Math.log10(n)/3); 
 
const format = n => (n < 0) ? ("-" + format(-n)): forms[Math.min(zeros(n), forms.length-1)](n); 
 

 
console.log(format(0)); 
 
console.log(format(101)); 
 
console.log(format(1010)); 
 
console.log(format(-1010)); 
 
console.log(format(1010000)); 
 
console.log(format(1010000000)); 
 
console.log(format(1010000000000)); 
 
console.log(format(1010000000000000));

做同樣的事情在三行代碼。

相關問題