使用正则表达式将格式化的货币金额转换为double值

时间:2018-01-12 17:16:14

标签: javascript

我有不同的货币格式,我想将其转换为double值。例如:

  1. 1,000,000.00 => 1000000.00
  2. 2'345',00 => 2345.00
  3. 2'344'334.03 => 1000000.03

    我有以下解决方案,它的工作效率非常低。我正在试图找出一些正则表达方式。

        decimalPlace = amount[amount.length - 3];
    
    if (decimalPlace === '.' && amount.indexOf(',') < -1 && amount.indexOf("'") < -1) {
        return amount
    }
    if (decimalPlace === ',' && amount.indexOf("'") < -1) {
        value = amount.split('.').join('')
            .replace(',', '.')
        return value
    }
    if (decimalPlace === '.' && amount.indexOf(',') > -1) {
        value = amount.split(',').join('')
        return value
    }
    
    if (decimalPlace === ',' && amount.indexOf("'") > -1) {
        value = amount.split("'").join('')
            .replace(',', '.')
        return value
    }
    if (decimalPlace === '.' && amount.indexOf("'") > -1) {
        value = amount.split("'").join('')
        return value
    }
    return amount
    
  4. 我很感激有关此问题的任何建议。

2 个答案:

答案 0 :(得分:1)

你可能已经把它变得更加复杂了。 如果这些是唯一需要支持的格式,您可以使用如下函数:

var v1 = "1,000,000.00";
var v2 = "2'345',00";
var v3 = "2'344'334.03";
var v4 = "2,00"

function format(str){
    if(str.replace(/[^,]/g, "").length === 1){ // Contains only one comma.
        str = str.replace(",", ".");
    }
    if(str.indexOf("'")!=-1){
       str = str.replace(/'/g, "").replace(",", ".");
    }
    return parseFloat(str.replace(/,/g, "")).toFixed(2);
}

[v1, v2, v3, v4].forEach(v => console.log(format(v)));

编辑:我只用一个逗号添加了对值的支持。

编辑2:实际上,似乎我自己犯了这个错误(使事情复杂化)。

我认为这一切都可以这么简单:

var v1 = "1,000,000.00";
var v2 = "2'345',00";
var v3 = "2'344'334.03";
var v4 = "2,00"

function format(str){
    if(str.replace(/[^,]/g, "").length === 1){ // Contains only one comma.
        str = str.replace(",", ".");
    }
    return parseFloat(str.replace(/[^0-9\.]/g, "")).toFixed(2);
}

[v1, v2, v3, v4].forEach(v => console.log(format(v)));

答案 1 :(得分:0)

我建议不要过多依赖正则表达式。我接近这个的方式分为两部分。

首先,弄清楚小数点是什么。这将根据区域设置进行更改,但它很容易解决 - 只需创建一个函数,它将添加一个本地化的小数点,然后返回它。

function getDecimalPoint(locale) {
    return (1.2).toLocaleString(locale).replace(/\d+/g, "");
}

此功能的好处是,如果你传入没有locale,将使用当前的一个(对我来说是“en-GB”)。

现在您可以识别小数点,您可以使用它将格式化的数字拆分为2个部分 - 甚至小数点前的整数(整数)和其后的所有内容(小数)。

function unformatNumber(number, locale) {

    // Split the number based on the decimal point.
    var numberParts = String(number).split(getDecimalPoint(locale));

    // Remove everything that isn't a number from the whole numbers and parse
    // it as a number.
    var unformatted = Number(numberParts[0].replace(/\D+/g, ""));

    // Check to see if there are any decimals. If there are, convert them into
    // a decimal and add them to the unformatted result.
    var decimals = numberParts[1];

    if (decimals && decimals.length) {
        unformatted += decimals / Math.pow(10, decimals.length);
    }

    return unformatted;

}

要使用它,只需将您的号码传递给该功能。

unformatNumber("1,000,000.00"); // -> 1000000
unformatNumber("2'345',00", "fr"); // -> 2345
unformatNumber("2'344'334.03"); // -> 2344344.03
// I know those numbers aren't formatted in French, but you can change your
// format as necessary.

function getDecimalPoint(locale) {
    return (1.2).toLocaleString(locale).replace(/\d+/g, "");
}

function unformatNumber(number, locale) {

    var numberParts = String(number).split(getDecimalPoint(locale));
    var unformatted = Number(numberParts[0].replace(/\D+/g, ""));
    var decimals = numberParts[1];

    if (decimals && decimals.length) {
        unformatted += decimals / Math.pow(10, decimals.length);
    }

    return unformatted;
    
}

console.log(unformatNumber("1,000,000.00"));
console.log(unformatNumber("2'345',00", "fr"));
console.log(unformatNumber("2'344'334.03"));