How can I parse a string with a comma thousand separator to a number?

后端 未结 16 2814
被撕碎了的回忆
被撕碎了的回忆 2020-11-22 10:18

I have 2,299.00 as a string and I am trying to parse it to a number. I tried using parseFloat, which results in 2. I guess the comma is the problem

16条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-22 10:28

    With this function you will be able to format values in multiple formats like 1.234,56 and 1,234.56, and even with errors like 1.234.56 and 1,234,56

    /**
     * @param {string} value: value to convert
     * @param {bool} coerce: force float return or NaN
     */
    function parseFloatFromString(value, coerce) {
        value = String(value).trim();
    
        if ('' === value) {
            return value;
        }
    
        // check if the string can be converted to float as-is
        var parsed = parseFloat(value);
        if (String(parsed) === value) {
            return fixDecimals(parsed, 2);
        }
    
        // replace arabic numbers by latin
        value = value
        // arabic
        .replace(/[\u0660-\u0669]/g, function(d) {
            return d.charCodeAt(0) - 1632;
        })
    
        // persian
        .replace(/[\u06F0-\u06F9]/g, function(d) {
            return d.charCodeAt(0) - 1776;
        });
    
        // remove all non-digit characters
        var split = value.split(/[^\dE-]+/);
    
        if (1 === split.length) {
            // there's no decimal part
            return fixDecimals(parseFloat(value), 2);
        }
    
        for (var i = 0; i < split.length; i++) {
            if ('' === split[i]) {
                return coerce ? fixDecimals(parseFloat(0), 2) : NaN;
            }
        }
    
        // use the last part as decimal
        var decimal = split.pop();
    
        // reconstruct the number using dot as decimal separator
        return fixDecimals(parseFloat(split.join('') +  '.' + decimal), 2);
    }
    
    function fixDecimals(num, precision) {
        return (Math.floor(num * 100) / 100).toFixed(precision);
    }
    
    parseFloatFromString('1.234,56')
    "1234.56"
    parseFloatFromString('1,234.56')
    "1234.56"
    parseFloatFromString('1.234.56')
    "1234.56"
    parseFloatFromString('1,234,56')
    "1234.56"
    

提交回复
热议问题