Culture sensitive ParseFloat Function in JavaScript?

試著忘記壹切 提交于 2019-11-28 09:16:40
Alex Polishchuk

I've improved mwilcox' function to handle values withous separators.

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

This is a bit rough-and-ready, but it may be sufficient, allowing you to pass in the thousands and decimal separators:

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

Examples:

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

NB that this doesn't ensure that the thousands separator really does represent thousands, etc., or do lots of other safeguarding that you may wish to do, depending on the importance of the function.

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

I'm just checking if there is a comma in the 3rd-to-last position. This could be further refined to check if there is a period in the 4th to last position in the case thee is no comma (such as 100.000)

Looking at lonesomday's gave me this thought:

You could also do:

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

Here is a rough function. It will assume the last punctuation to indicate decimals, whether it is a comma, period, or any other character you may need to indicate. It then eliminates other punctuations from the whole number. Puts it back together and parses as float.

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

try this:

alert(normalizeFloat('12.345,77', [',','.']).toFixed(2));
alert(normalizeFloat('12,345.77', [',','.']).toFixed(2));
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!