2013-10-29 46 views
0

我已經瀏覽了無數的線程在這裏和其他地方超過2天,我無法得到這個工作正常。適當的JS貨幣格式,逗號和小數

我有一臺計算器正好按照我需要的方式工作,但是,我似乎無法完成最後一件事情。用逗號隔開的逗號分隔符。

我有小數位,但不能加逗號。當我添加逗號時,可以在計算中斷之前讓一個或兩個字段工作,或者將值顯示爲NaN。

這裏的工作頁面:http://codepen.io/anon/pen/Fauzy

它目前使用這個:

function FormatAsMoney(mnt) { 
mnt -= 0; 
mnt = (Math.round(mnt*100))/100; 
return (mnt == Math.floor(mnt)) ? mnt + '.00' 
: ((mnt*10 == Math.floor(mnt*10)) ? 
mnt + '0' : mnt); 
} 

如果我嘗試使用此:

function FormatAsMoney(x) 

     { 


      var money_value; 

      mnt = x.value; 

      mnt = mnt.replace(/\,/g,''); 

      mnt -= 0; 

      mnt = (Math.round(mnt*100))/100; 

      money_value = (mnt == Math.floor(mnt)) ? mnt + '.00' : ((mnt*10 == Math.floor(mnt*10)) ? mnt + '0' : mnt); 

      if (isNaN(money_value)) 
      { 
       money_value ="0.00"; 

      }else{ 
     money_value = CommaFormatted(money_value);  
     x.value = money_value.replace(".00", ""); 
    } 

} 

它不會在所有的工作。

我沒有使用其他測試:

function FormatAsMoney(str) { 
    return (str + "").replace(/\b(\d+)((\.\d+)*)\b/g, function(a, b, c) { 
    return (b.charAt(0) > 0 && !(c || ".").lastIndexOf(".") ? b.replace(/(\d)(?=(\d{3})+$)/g, "$1,") : b) + c; 
    }); 
} 

在我得到逗號的第一個字段的格式,但失去小數和它不會繼續任何其他計算。

另一個例子我創建了另一個函數中添加逗號,如:

function addCommas(nStr){ 
    nStr += ''; 
    c = nStr.split(','); // Split the result on commas 
    nStr = c.join(''); // Make it back to a string without the commas 
    x = nStr.split('.'); 
    x1 = x[0]; 
    x2 = x.length > 1 ? '.' + x[1] : ''; 
    var rgx = /(\d+)(\d{3})/; 
    while (rgx.test(x1)) { 
     x1 = x1.replace(rgx, '$1' + ',' + '$2'); 
    } 
    return x1 + x2; 
} 

然後我用它喜歡:

document.Rate.RATE.value=addCommas(FormatAsMoney(dasum)); 

這似乎是我一直還沒有最好的結局,但是在線(163),例如,function dosum()依賴於許多if語句,它再次打破。我似乎無法讓它適用於價值將達到數千的所有應用領域。

我需要能夠輸入頂部2000萬美元「20000000」的「保險金額」(作爲一個例子,因爲它將填充幾乎所有可能的字段,將有一個逗號分隔的小數點位置)

任何人都可以結束我的苦難嗎?謝謝你的幫助。

+0

你是說沒有在[個方法是問題](http://stackoverflow.com/questions/149055/how-can-i-format-numbers-as-money-in-javascript)工作?擁有超過450票的人似乎在測試後很快就能正常工作。 – numbers1311407

+0

還有[toLocaleString](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString) – numbers1311407

回答

0

我猜你的問題是做數學,而不是格式化值。

您從文本字段獲得的值是'string'類型。當你對簡單的字符串進行數學計算時,Javascript會自動將它們強制轉換爲數字。但是一旦你添加格式化,這個自動轉換就會中斷。

console.log('5000' - '2000'); // outputs the value 3000 of type number 
console.log('5,000' - '2,000'); // outputs NaN - this is an invalid format for auto-conversion to numbers 

一旦你在文本字段中格式化你的值,你必須把它們當作字符串。爲了做數學,你必須把它們解析成數字。

喜歡的東西:

function parseCommaSeparated(strVal) { 
    return parseFloat(strVal.replace(',','');) // remove commas before parse 
} 
1

您可能已經提供了一些投入和相應的輸出來形容您的問題更加清晰。我假設你需要一個函數來獲得輸入的任何非負數,並希望輸出一個用小數點和千位分隔符格式化的字符串。如果我的假設是真的以下可以幫助你,在Firefox測試24.0/Linux的:

<!DOCTYPE html> 
<html> 
<head> 
    <title>HTML</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <script type="text/javascript"> 
     var decimalSeparator = "."; 
     var decimalDefault = decimalSeparator + "00"; 
     var thousandsSeparator = ","; 

     /** 
     * @param {String or Number} value The value to format 
     * @returns {String} The formatted Number as a String 
     */ 
     function formatMoney(value) { 
      var valueStr = String(value); 
      var decimalDividerPos = valueStr.indexOf("."); 
      var decimalPart = decimalDividerPos == -1 ? decimalDefault : decimalSeparator + valueStr.substr(decimalDividerPos + 1); 
      var integerPart = decimalDividerPos == -1 ? valueStr : valueStr.substring(0, decimalDividerPos); 
      var integerAry = new Array(); 
      var lenTemp = 0; 
      for (var i = integerPart.length - 1; i >= 0; i--) { 
       integerAry.unshift(integerPart.substr(i, 1)); 
       if (i && (!(++lenTemp % 3))) { 
        integerAry.unshift(thousandsSeparator); 
       } 
      } 
      return integerAry.join("") + decimalPart; 
     } 
    </script> 
<body> 
    <script type="text/javascript"> 
     var testValues = new Array(
       0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 
       0.9876, 1.9876, 10.9876, 100.9876, 1000.9876, 10000.9876, 100000.9876, 1000000.9876, 10000000.9876, 
       1234567e+123, Number.MAX_VALUE); 
     for (var x in testValues) { 
      console.log("VALUE=" + testValues[x] + " => FORMATTED=" + formatMoney(testValues[x])); 
     } 
    </script> 
</body> 
</html> 
2

嘗試很多不同的解決方案之後,這似乎是(對我)的最佳方式:

jsFiddle Demo

(1234568).toLocaleString("en-US", {style: "decimal", minimumFractionDigits: 2}); 

var opts = '{style: "decimal", currency: "USD", minimumFractionDigits: 2}'; 
(1234568).toLocaleString("en-US", opts); 

(1234568).toLocaleString("en-US", {style: "decimal", minimumFractionDigits: 0}); 

我喜歡NickG's comment from mid-2013:「同意,這不是完全在所有瀏覽器(至今)的支持,但它仍然是一個解決方案。 (而且可以說是最有效的解決方案,因爲它與不支持的瀏覽器向前兼容,而且它的JavaScript API的文檔功能)。

來源:

jsFiddle Demo

How can I format numbers as money in JavaScript?

How to print a number with commas as thousands separators in JavaScript