2011-05-25 18 views
0

我有這個腳本是工作在格式化我的貨幣,但現在它自己的價值不是固定爲0位小數,林新的JavaScript所以可能有人解釋在哪裏和藿我這樣做呢?由於修復JavaScript值到0的小數

function FormatNumberBy3(num, decpoint, sep) { 
    // check for missing parameters and use defaults if so 
    if (arguments.length == 2) { 
    sep = ","; 
    } 
    if (arguments.length == 1) { 
    sep = ","; 
    decpoint = "."; 
    } 
    // need a string for operations 
    num = num.toString(); 
    // separate the whole number and the fraction if possible 
    a = num.split(decpoint); 
    x = a[0]; // decimal 
    y = a[1]; // fraction 
    z = ""; 


    if (typeof(x) != "undefined") { 
    // reverse the digits. regexp works from left to right. 
    for (i=x.length-1;i>=0;i--) 
     z += x.charAt(i); 
    // add seperators. but undo the trailing one, if there 
    z = z.replace(/(\d{3})/g, "$1" + sep); 
    if (z.slice(-sep.length) == sep) 
     z = z.slice(0, -sep.length); 
    x = ""; 
    // reverse again to get back the number 
    for (i=z.length-1;i>=0;i--) 
     x += z.charAt(i); 
    // add the fraction back in, if it was there 
    if (typeof(y) != "undefined" && y.length > 0) 
     x += decpoint + y; 
    } 
    return x; 
} 
+0

你知道'toFixed'(https://開頭developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Number/toFixed)?也許它可以幫助... – 2011-05-25 15:26:10

+0

我用.toFixed但似乎與上面... – Rashid84 2011-05-25 15:27:10

回答

0

您可以用數學整數點位,這是非常非常快和多,更簡單得多。單單在這個網站上就有數百個這種算法的例子。

function round(number, places) 
{ 
    var multiplicator = Math.pow(10, places); 
    return Math.round(number * multiplicator)/multiplicator; 
} 

alert(round(123.456, 0)); // alerts "123" 

此函數讓您四捨五入到任意小數位。如果你想四捨五入到最接近的整數,你可以簡單地使用Math.round(x)

Math.round舍入小數到最接近的整數。假設你想保持位小數,所有你需要做的就是乘以1000的十進制數(即10功率),四捨五入到最接近的整數,然後通過1000這道鴻溝是這個片段做什麼。

+0

感謝zneak到claseh,我可以問這是如何工作? – Rashid84 2011-05-25 15:28:41

+0

唉唉,我需要的成千上萬的後面添加逗號,所以我不認爲這會工作 – Rashid84 2011-05-25 15:30:42

0

你的函數似乎適用於我...我認爲傳遞"1000"作爲參數的結果應該是"1,000"?我不確定我是否理解「將[您的]值修正爲0位小數」的含義。

下面是我寫的數字格式(如您上面的函數一樣)一個API一次函數:

function num_format(str) { 
    if (typeof str !== 'string' || /[^\d,\.e+-]/.test(str)) { 
     if (typeof str === 'number') { 
      str = str.toString(); 
     } else { 
      throw new TypeError("Argument is not a string with a number in it"); 
     } 
    } 
    var reg = /(\d+)(\d{3})/; 
    str = str.split("."); 
    while (reg.test(str[0])) { 
     str[0] = str[0].replace(reg, "$1,$2"); 
    } 
    return str.join("."); 
} 

刪除錯誤校驗碼,它變得相當短的小功能(五類線)。將它傳遞給任何數字,並將它正確格式化,雖然我不允許指定分隔符的選項。

至於四​​舍五入數字任意小數位,我建議上面看到zneak's answer。然後就簡單地做:

num_format(round("100000.12341234", 2)); 

這將使的"100,000.12"結果。

0

這個功能應該能夠所有各種情況的:

function formatNumber(num, precision, sep, thousand, addTrailing0) { 
    if (isNaN(num)) 
     return ""; 
    if (isNaN(precision)) 
     precision = 2; 
    if (typeof addTrailing0 == "undefined") 
     addTrailing0 = true; 

    var factor = Math.pow(10, precision); 
    num = String(Math.round(num * factor)/factor); 

    if (addTrailing0 && precision > 0) { 
     if (num.indexOf(".") < 0) 
      num += "."; 
     for (var length = num.substr(num.indexOf(".")+1).length; length < precision; ++length) 
      num += "0"; 
    } 

    var parts = num.split("."); 
    parts[0] = parts[0].split("").reverse().join("").replace(/(\d{3})(?=\d)/g, "$1" + (thousand || ",")).split("").reverse().join(""); 

    num = parts[0] + (parts.length > 1 ? (sep || ".") + parts[1] : ""); 

    //debug: 
    document.write(num + "<br />"); 

    return num; 
} 

例子:

formatNumber(32432342342.3574, 0);    // 32,432,342,342 
formatNumber(32432342342.3574, 2);    // 32,432,342,342.36 
formatNumber(1342.525423, 4, ".", ",");  //   1,342.5254 
formatNumber(1342.525423, 2, ",", ".");  //   1.342,53 
formatNumber(1342.525423);      //   1,342.53 
formatNumber(1342.525423, 0);     //   1,343 
formatNumber(342.525423, 8);     //   342.52542300 
formatNumber(42.525423, 8, null, null, false); //    42.525423 
formatNumber(2.5, 3, ",", ".");    //    2,500 

工作現場演示在http://jsfiddle.net/roberkules/xCqqh/