5

我在 stackoverflow 上找到了一个正则表达式来添加“,”或“。” 在每三个数字之后,具体取决于您的语言。

(\d)(?=(\d\d\d)+(?!\d))

问题是当我们到达小数点时也会发生这种情况,例如:

5487445.46878

使用以下代码(和正则表达式)的结果是:

return number.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");

结果是:

5,487,445.46,878

当我根据您的语言转换数字时,我正在使用这个正则表达式。例如,在荷兰语中,逗号用作分隔符,因此我执行以下操作:

return number.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1.")

这导致

5.487.445,46.878

这些当然需要变成:

5,487,445.46878

5.487.445,4687

有人知道我需要在哪里更新正则表达式以忽略小数点吗?

4

3 回答 3

3

如果它有逗号或点,您可以先使用您的RegEx但拆分您的号码。

jsFiddle 演示

 var input = '5487445.46878';
 var parts = input.split('.');
 var part1 = parts[0].replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
 var part2 = parts[1];

 alert(part1 + '.' + part2);
于 2013-08-29T14:36:01.617 回答
2

你可以试试这个: -

    function thousandsSeparator(input) {
    var output = input
    if (parseFloat(input)) {
        input = new String(input);
        var parts = input.split("."); 
        parts[0] = parts[0].split("").reverse().join("").replace(/(\d{3})(?!$)/g, "$1,").split("").reverse().join("");
        output = parts.join(".");
    }

    return output;
}
于 2013-08-29T14:23:17.457 回答
0

与 ECMAScript 2018+ 兼容RegExp,您可以使用

text = text.replace(/(?<!\.\d*)(\d)(?=(?:\d{3})+(?!\d))/g, "$1,")

请参阅正则表达式演示详情

  • (?<!\.\d*)- 如果在当前位置的左边有一个.然后零个或多个数字,则匹配失败
  • (\d)- 捕获到第 1 组的任何一位数字
  • (?=(?:\d{3})+(?!\d))- 正向前瞻,需要一个或多个三位数字序列,而不是紧跟在当前位置右侧的另一个数字。

请参阅 JavaScript 演示:

const re = /(?<!\.\d*)(\d)(?=(?:\d{3})+(?!\d))/g;
[
    {str: "123456789.123456789", expect: "123,456,789.123456789"},
    {str: "123456789", expect: "123,456,789"},
    {str: "12345678.123456789", expect: "12,345,678.123456789"},
    {str: "12345678",      expect: "12,345,678"},
    {str: "1234567.123456789",      expect: "1,234,567.123456789"},
    {str: "1234567",      expect: "1,234,567"}
].forEach(test);

function test(entry) {
    const result = entry.str.replace(re, "$1,");
    console.log(`Testing ${entry.str}, got ${result}, ${(result == entry.expect ? "OK" : "ERROR")}`);
}

于 2022-02-23T11:04:20.123 回答