【问题标题】:Culture sensitive ParseFloat Function in JavaScript?JavaScript中的文化敏感ParseFloat函数?
【发布时间】:2011-02-09 23:17:26
【问题描述】:

有没有人建议在 JavaScript 中编写文化敏感的 ParseFloat 函数,这样当我有一个美国文化格式的字符串 100,000.22 时,解析浮点函数返回 100000.22,而如果我在瑞典文化中输入 100.000,22,它会返回浮点数 100000.22?

【问题讨论】:

标签: javascript cultureinfo


【解决方案1】:

我改进了 mwilcox' 函数来处理没有分隔符的值。

function parseFloatOpts (str) {

     if(typeof str === "number"){
         return str;
     }

     var ar = str.split(/\.|,/);  

     var value = '';
     for (var i in ar) {
         if (i>0 && i==ar.length-1) {
             value += ".";
         }
         value +=ar[i];
     }
     return Number(value);
}

【讨论】:

    【解决方案2】:

    这有点粗略,但可能就足够了,允许您传入千位和小数分隔符:

    function parseFloatOpts(num, decimal, thousands) {
        var bits = num.split(decimal, 2),
            ones = bits[0].replace(new RegExp('\\' + thousands, 'g'), '');
            ones = parseFloat(ones, 10),
            decimal = parseFloat('0.' + bits[1], 10);
            return ones + decimal;
    }
    

    例子:

    parseFloatOpts("100.000,22", ',', '.'); //100000.22
    parseFloatOpts("100,000.22", '.', ','); //100000.22
    

    请注意,这并不能确保千位分隔符确实代表千位等,或者根据功能的重要性,您可能希望执行许多其他保护措施。

    【讨论】:

    • 感谢您的回复,我可以在 ASP.Net 中解决问题。请参阅我的原始帖子中的上述回复。
    【解决方案3】:
    var parse = function(st){
       if(st.indexOf(",") === st.length-3){
          st = st.replace(".", "").replace(",", ".");
       }else{
           st = st.replace(",", "");
       }
       return parseFloat(st, 10)
    }
    
    console.log(parse("100,000.22")) // 100000.22
    console.log(parse("100.000,22")) // 100000.22
    

    我只是检查倒数第三个位置是否有逗号。这可以进一步细化以检查在你不是逗号的情况下倒数第四个位置是否有句点(例如 100.000)

    【讨论】:

      【解决方案4】:

      看lonesomday给了我这样的想法:

      你也可以这样做:

      function parse (str)
          var ar = str.split(/\.|,/);  
          return Number(ar[0]+ar[1]+"."+ar[3]);
      

      【讨论】:

      • 对于可变数量的千位分隔符如何工作?
      【解决方案5】:

      这是一个粗略的函数。它将假定最后一个标点符号表示小数,无论它是逗号、句点还是您可能需要表示的任何其他字符。然后它会从整数中删除其他标点符号。将其重新组合在一起并解析为浮点数。

      function normalizeFloat(number, chars) {
      
          var lastIndex = -1;
          for(i=0; i < chars.length; i++) {
              t = number.lastIndexOf(chars[i]);
      
              if (t > lastIndex) {
                  lastIndex = t;
              }
          }
      
          if (lastIndex == -1) {
              lastIndex = number.length;
          }
      
          var whole = number.substring(0, lastIndex);   
          var precision = number.substring(lastIndex);
          for (i=0; i < chars.length; i++) {
              whole = whole.replace(chars[i], '');
              precision = precision.replace(chars[i],'.');           
          }
          number = whole + precision;
      
          f = parseFloat(number);
          return f;
      }
      

      试试这个:

      alert(normalizeFloat('12.345,77', [',','.']).toFixed(2));
      alert(normalizeFloat('12,345.77', [',','.']).toFixed(2));
      

      【讨论】:

        【解决方案6】:

        需要文化信息中当前的组和小数分隔符。

        function escapeRegExp(string) {
                return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
            }
        
        function parseFloatOpts(str, groupSeparator, decimalSeparator) {
        
                if (typeof str === "number") {
                    return str;
                }
        
                var value = str.replace(new RegExp(escapeRegExp(groupSeparator), 'g'), "");
                value = value.replace(decimalSeparator, ".");
        
                return Number(value);
            }
        

        【讨论】:

          【解决方案7】:

          如果您真的想在 JavaScript 的不同语言环境中显示和/或解析浮点数(或日期或货币或更多),那么我的建议是 GlobalizeJS (https://github.com/globalizejs/globalize) 库。

          一开始设置起来有点困难(至少根据我的经验),但完全建议妥善管理这个问题。

          【讨论】:

            猜你喜欢
            • 2019-01-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-23
            • 1970-01-01
            • 2019-12-16
            • 2018-10-27
            • 2018-03-01
            相关资源
            最近更新 更多