【问题标题】:How to convert a currency string to a double with Javascript?如何使用 Javascript 将货币字符串转换为双精度?
【发布时间】:2010-10-08 05:31:19
【问题描述】:

我有一个文本框,其中包含一个 currency 字符串,然后我需要将该字符串转换为双精度字符串以对其执行一些操作。

"$1,100.00"1100.00

这需要发生在所有客户端。我别无选择,只能将 currency 字符串作为 currency 字符串作为输入,但需要将其转换/转换为双精度以允许进行一些数学运算。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    简单点怎么样

    Number(currency.replace(/[^0-9-]+/g,""))/100;
    

    适用于所有货币和语言环境。替换所有非数字字符(您可以有 €50.000,00 或 $50,000.00)输入必须有 2 位小数

    【讨论】:

      【解决方案2】:
      let thousands_seps = '.';
      let decimal_sep = ',';
      
      let sanitizeValue = "R$ 2.530,55".replace(thousands_seps,'')
                               .replace(decimal_sep,'.')
                               .replace(/[^0-9.-]+/, '');
      
      // Converting to float
      // Result 2530.55
      let stringToFloat = parseFloat(sanitizeValue);
      
      
      // Formatting for currency: "R$ 2.530,55"
      // BRL in this case
      let floatTocurrency = Number(stringToFloat).toLocaleString('pt-BR', {style: 'currency', currency: 'BRL'});
      
      // Output
      console.log(stringToFloat, floatTocurrency);
      

      【讨论】:

      • 穆伊托邦,维克多。
      【解决方案3】:

      对于在 2021 寻找解决方案的任何人,您可以使用 Currency.js

      经过大量研究,这是我发现的最可靠的生产方法,到目前为止我没有任何问题。此外,它在 Github 上非常活跃。

      currency(123);      // 123.00
      currency(1.23);     // 1.23
      currency("1.23")    // 1.23
      currency("$12.30")  // 12.30
      
      var value = currency("123.45");
      currency(value);    // 123.45
      

      【讨论】:

        【解决方案4】:

        如此令人头疼,而对其他文化的考虑却更少......

        这里是伙计们:

        let floatPrice = parseFloat(price.replace(/(,|\.)([0-9]{3})/g,'$2').replace(/(,|\.)/,'.'));
        

        就这么简单。

        【讨论】:

        • 这适用于比所选答案更多的情况。谢谢
        【解决方案5】:

        这是一个简单的函数 -

        function getNumberFromCurrency(currency) {
          return Number(currency.replace(/[$,]/g,''))
        }
        
        console.log(getNumberFromCurrency('$1,000,000.99')) // 1000000.99

        【讨论】:

          【解决方案6】:

          这个例子运行正常

          var currency = "$1,123,456.00";
          var number = Number(currency.replace(/[^0-9\.]+/g,""));
          console.log(number);

          【讨论】:

            【解决方案7】:

            这对我有用,涵盖了大多数边缘情况:)

            function toFloat(num) {
              const cleanStr = String(num).replace(/[^0-9.,]/g, '');
              let dotPos = cleanStr.indexOf('.');
              let commaPos = cleanStr.indexOf(',');
            
              if (dotPos < 0) dotPos = 0;
            
              if (commaPos < 0) commaPos = 0;
            
              const dotSplit = cleanStr.split('.');
              const commaSplit = cleanStr.split(',');
            
              const isDecimalDot = dotPos
                && (
                  (commaPos && dotPos > commaPos)
                  || (!commaPos && dotSplit[dotSplit.length - 1].length === 2)
                );
            
              const isDecimalComma = commaPos
                && (
                  (dotPos && dotPos < commaPos)
                  || (!dotPos && commaSplit[commaSplit.length - 1].length === 2)
                );
            
              let integerPart = cleanStr;
              let decimalPart = '0';
              if (isDecimalComma) {
                integerPart = commaSplit[0];
                decimalPart = commaSplit[1];
              }
              if (isDecimalDot) {
                integerPart = dotSplit[0];
                decimalPart = dotSplit[1];
              }
            
              return parseFloat(
                `${integerPart.replace(/[^0-9]/g, '')}.${decimalPart.replace(/[^0-9]/g, '')}`,
              );
            }
            
            
            toFloat('USD 1,500.00'); // 1500
            toFloat('USD 1,500'); // 1500
            toFloat('USD 500.00'); // 500
            toFloat('USD 500'); // 500
            
            toFloat('EUR 1.500,00'); // 1500
            toFloat('EUR 1.500'); // 1500
            toFloat('EUR 500,00'); // 500
            toFloat('EUR 500'); // 500
            

            【讨论】:

              【解决方案8】:

              我知道这是一个老问题,但 CMS 的答案似乎有一个小小的缺陷:它只有在货币格式使用“。”时才有效。作为小数分隔符。 例如,如果您需要使用俄罗斯卢布,则字符串将如下所示: “1 000,00 卢布。”

              我的解决方案远没有 CMS 的优雅,但它应该可以解决问题。

              var currency = "1 000,00 rub."; //it works for US-style currency strings as well
              var cur_re = /\D*(\d+|\d.*?\d)(?:\D+(\d{2}))?\D*$/;
              var parts = cur_re.exec(currency);
              var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00'));
              console.log(number.toFixed(2));

              假设:

              • 货币值使用十进制表示法
              • 字符串中没有不属于货币值的数字
              • 货币值的小数部分包含 0 位或 2 位数字 *

              正则表达式甚至可以处理“1,999 美元和 99 美分”之类的内容,尽管它不是预期的功能,也不应该依赖它。

              希望这会对某人有所帮助。

              【讨论】:

              • 谢谢。最佳答案。简单而强大。我会将它与 (\D*)(\d.*?\d)(?:\D+(\d{2}|-))?(\D*)$ 一起使用来获取货币和 - 获取美分。所以你也可以解析像 1.000,- € 这样的字符串。货币将在part[1] 或part[4] 中,part[3] 包括美分作为数字或-。比你可以像你想要的那样规范化字符串。
              • 这是非常糟糕和危险的,它将小于 10 的数字乘以 100。我在用它测试所有数字之前愚蠢地使用了它:(
              • @sheavens 感谢您的报告。抱歉这么晚才修复它,但新版本实际上也适用于这些金额。
              【解决方案9】:

              你可以试试这个

              var str = "$1,112.12";
              str = str.replace(",", "");
              str = str.replace("$", "");
              console.log(parseFloat(str));

              【讨论】:

              • 这会失败,例如 "$1,000,000.00" -> 1000 - 需要使用正则表达式替换字符串中的所有匹配项
              【解决方案10】:

              无论区域设置和货币设置如何,此功能都应适用:

              function getNumPrice(price, decimalpoint) {
                  var p = price.split(decimalpoint);
                  for (var i=0;i<p.length;i++) p[i] = p[i].replace(/\D/g,'');
                  return p.join('.');
              }
              

              这假设你知道小数点字符(在我的例子中,语言环境是从 PHP 设置的,所以我用&lt;?php echo cms_function_to_get_decimal_point(); ?&gt; 得到它)。

              【讨论】:

                【解决方案11】:
                var parseCurrency = function (e) {
                    if (typeof (e) === 'number') return e;
                    if (typeof (e) === 'string') {
                        var str = e.trim();
                        var value = Number(e.replace(/[^0-9.-]+/g, ""));
                        return str.startsWith('(') && str.endsWith(')') ? -value: value;
                    }
                
                    return e;
                } 
                

                【讨论】:

                  【解决方案12】:

                  删除所有非点/数字:

                  var currency = "-$4,400.50";
                  var number = Number(currency.replace(/[^0-9.-]+/g,""));
                  

                  【讨论】:

                  • 这似乎只适用于有.00 尾随的情况。否则,货币的有效表示,例如“$1100”和“$1100”。将减少两个数量级。
                  • 请记住,这取决于语言环境,因为其他语言环境使用 ',' 表示小数(例如 1.100,00€)。其他一些语言环境甚至每组使用不同的标准位数(如 3 位小数)。
                  • 为了处理字符串中的负数,我在要接受的字符列表中添加了一个“-”,即 .replace(/[^0-9-\.]+/g, "" )
                  • 另外请记住,一些会计应用程序将数字括在括号中以表示负值。例如:($5.00) = -$5.00
                  • 我知道我在这里回复可能会晚几年,但如果“货币 = 0”,您也需要小心。你会得到一个 javascript 错误,说 currency.replace 不是一个函数。我只是添加了一个简单的检查,如果货币 = 0 来避免这种情况。
                  【解决方案13】:
                  function NumberConvertToDecimal (number) {
                      if (number == 0) {
                         return '0.00'; 
                      }
                      number = parseFloat(number);
                      number = number.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1");
                      number = number.split('.').join('*').split('*').join('.');
                      return number;
                  }
                  

                  【讨论】:

                    【解决方案14】:

                    // "10.000.500,61 TL" price_to_number => 10000500.61

                    // "10000500.62" number_to_price => 10.000.500,62

                    JS FIDDLE:https://jsfiddle.net/Limitlessisa/oxhgd32c/

                    var price="10.000.500,61 TL";
                    document.getElementById("demo1").innerHTML = price_to_number(price);
                    
                    var numberPrice="10000500.62";
                    document.getElementById("demo2").innerHTML = number_to_price(numberPrice);
                    
                    function price_to_number(v){
                        if(!v){return 0;}
                        v=v.split('.').join('');
                        v=v.split(',').join('.');
                        return Number(v.replace(/[^0-9.]/g, ""));
                    }
                    
                    function number_to_price(v){
                        if(v==0){return '0,00';}
                        v=parseFloat(v);
                        v=v.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
                        v=v.split('.').join('*').split(',').join('.').split('*').join(',');
                        return v;
                    }
                    

                    【讨论】:

                      【解决方案15】:

                      accounting.js 是要走的路。我在一个项目中使用过,使用体验非常好。

                      accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
                      accounting.unformat("€ 1.000.000,00", ","); // 1000000
                      

                      您可以在GitHub找到它

                      【讨论】:

                      【解决方案16】:

                      这是我的功能。适用于所有货币..

                      function toFloat(num) {
                          dotPos = num.indexOf('.');
                          commaPos = num.indexOf(',');
                      
                          if (dotPos < 0)
                              dotPos = 0;
                      
                          if (commaPos < 0)
                              commaPos = 0;
                      
                          if ((dotPos > commaPos) && dotPos)
                              sep = dotPos;
                          else {
                              if ((commaPos > dotPos) && commaPos)
                                  sep = commaPos;
                              else
                                  sep = false;
                          }
                      
                          if (sep == false)
                              return parseFloat(num.replace(/[^\d]/g, ""));
                      
                          return parseFloat(
                              num.substr(0, sep).replace(/[^\d]/g, "") + '.' + 
                              num.substr(sep+1, num.length).replace(/[^0-9]/, "")
                          );
                      
                      }
                      

                      用法:toFloat("$1,100.00")toFloat("1,100.00$")

                      【讨论】:

                        【解决方案17】:
                            $ 150.00
                            Fr. 150.00
                            € 689.00
                        

                        以上三种货币符号我已经测试过了。你也可以为其他人做。

                            var price = Fr. 150.00;
                            var priceFloat = price.replace(/[^\d\.]/g, '');
                        

                        上面的正则表达式将删除不是数字或句点的所有内容。因此,您可以获得没有货币符号的字符串,但如果您控制台输出为“Fr. 150.00”,那么您将获得价格为

                            console.log('priceFloat : '+priceFloat);
                        
                            output will be like  priceFloat : .150.00
                        

                        这是错误的,所以你检查“。”的索引。然后拆分它并得到正确的结果。

                            if (priceFloat.indexOf('.') == 0) {
                                    priceFloat = parseFloat(priceFloat.split('.')[1]);
                            }else{
                                    priceFloat = parseFloat(priceFloat);
                            }
                        

                        【讨论】:

                          【解决方案18】:

                          我知道这是一个老问题,但想提供一个额外的选择。

                          jQuery Globalize 提供了将文化特定格式解析为浮点数的能力。

                          https://github.com/jquery/globalize

                          给定一个字符串“$13,042.00”,并将 Globalize 设置为 en-US:

                          Globalize.culture("en-US");
                          

                          你可以像这样解析浮点值:

                          var result = Globalize.parseFloat(Globalize.format("$13,042.00", "c"));
                          

                          这会给你:

                          13042.00
                          

                          并允许您与其他文化合作。

                          【讨论】:

                            【解决方案19】:
                            jQuery.preferCulture("en-IN");
                            var price = jQuery.format(39.00, "c");
                            

                            输出为:卢比。 39.00

                            use jquery.glob.js,
                                jQuery.glob.all.js
                            

                            【讨论】:

                              【解决方案20】:

                              我知道您已经找到了问题的解决方案,我只是想建议您看看以下更广泛的国际数字格式 jQuery 插件:

                              International Number Formatter

                              【讨论】:

                                【解决方案21】:

                                使用正则表达式去除格式(美元和逗号),并使用 parseFloat 将字符串转换为浮点数。`

                                var currency = "$1,100.00";
                                currency.replace(/[$,]+/g,"");
                                var result = parseFloat(currency) + .05;
                                

                                【讨论】:

                                • 值得注意的是,在添加货币时,您不应将浮点数用于任何非“玩具”应用程序。您最终会得到确切的总数。
                                • 当 parseFloat("151.20" * 100) 给你 15119.999999999998 但 parseFloat("151.40" * 100) 给你 15140 时,你会感到惊讶和不高兴。永远不要使用 parseFloat 来赚钱。使用特定的库来处理金钱,例如 accounting.js 或此处建议的任何其他库。
                                • + .05 是干什么用的?
                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2022-01-16
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多