【问题标题】:Proper JS currency format with commas and decimals带有逗号和小数的正确 JS 货币格式
【发布时间】:2013-11-09 00:05:30
【问题描述】:

我在这里和其他地方查看了无数线程超过 2 天,但我无法让它正常工作。

我的计算器完全按照我的需要工作,但是,我似乎无法完成最后一件事。千位逗号分隔符和小数点。

我有小数位,但不能添加逗号。当我添加逗号时,我可以让一两个字段在计算中断或值显示为 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”中输入“保险金额”(作为示例,因为它将填充几乎所有可能的字段,这些字段将以逗号分隔值和小数点)

谁能结束我的痛苦?感谢您的帮助。

【问题讨论】:

  • 你是说this question 中的方法都不起作用?经过快速测试,获得 450+ 票的那个似乎可以工作。

标签: javascript decimal currency calculator comma


【解决方案1】:

我猜你的问题是在做数学运算时,而不是在格式化值时。

您从文本字段中获得的值是“字符串”类型。当您对简单的字符串进行数学运算时,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
}

【讨论】:

    【解决方案2】:

    您可以提供一些输入和相应的输出来更清楚地描述您的问题。我假设您需要一个函数,该函数将任何非负数作为输入,并希望输出一个用小数点和千位分隔符格式化的字符串。如果我的假设是正确的,那么以下内容可能会对您有所帮助,并在 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>
    

    【讨论】:

    • 绝对是最佳答案!
    【解决方案3】:

    在尝试了许多不同的解决方案之后,这似乎(对我来说)是最好的方法:

    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

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 2014-07-24
      • 1970-01-01
      • 2022-08-06
      • 2015-10-08
      • 1970-01-01
      • 2016-11-03
      • 2019-01-15
      • 2012-01-29
      相关资源
      最近更新 更多