JavaScript中的文化敏感ParseFloat函数?

时间:2011-02-09 23:17:26

标签: javascript cultureinfo

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

7 个答案:

答案 0 :(得分:6)

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

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);
}

答案 1 :(得分:3)

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

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

请注意,这并不能确保数千个分隔符确实代表数千个等等,或者根据函数的重要性,执行许多其他您可能希望执行的操作。

答案 2 :(得分:1)

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

我只是检查倒数第三个位置是否有逗号。这可以进一步细化,以检查在没有逗号的情况下是否存在第4个到最后位置的句点(例如100.000)

答案 3 :(得分:1)

看着lonesomday给了我这个想法:

你也可以这样做:

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

答案 4 :(得分:0)

这是一个粗略的功能。它将假设最后一个标点符号表示小数,无论是逗号,句号还是您可能需要指示的任何其他字符。然后它从整数中消除了其他标点符号。把它放回去并解析为浮动。

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));

答案 5 :(得分:0)

需要从“文化信息”中选择当前的组和小数分隔符。

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);
    }

答案 6 :(得分:0)

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

一开始设置起来有点困难(至少以我的经验),但是强烈建议对此事进行适当的管理。