使用正则表达式格式化负数

时间:2015-07-24 10:49:14

标签: javascript regex

我需要格式化我的数字,我正在使用正则表达式/(?=(?!^)(?:\ d {3})+ $)/ g,在必要时替换和插入。但目前我有一个负数{3} 000号的问题,所以在减号后添加逗号。

我做错了什么?



'-200'.replace(/(?=(?!^)(?:\d{3})+$)/g, ',')

returns: -,200
correct: -200

'-2000'.replace(/(?=(?!^)(?:\d{3})+$)/g, ',')
returns: -2,000
correct: -2,000




4 个答案:

答案 0 :(得分:1)

我建议您将^替换为\b

(?=(?!\b)(?:\d{3})+$)

DEMO

(?!^)断言我们不仅仅是开始,但是(?!\b)断言我们不在单词char和非单词字符之间(反之亦然 )。

示例:

alert('-200'.replace(/(?=(?!\b)(?:\d{3})+$)/g, ','))
alert('-2000'.replace(/(?=(?!\b)(?:\d{3})+$)/g, ','))

答案 1 :(得分:1)

您可以使用此正则表达式:

var num = '-2000';
var repl = num.replace(/(\d)(?=(?:\d{3})+$)/m, '$1,');

var repl = num.replace(/(?=(?:\B\d{3})+$)/m, ',');

RegEx Demo

答案 2 :(得分:0)

要处理已签名的号码,我建议使用除正则表达式之外的其他内容

function formatInteger(num) {
    var str = ('' + num).split('.')[0];
    var sign = (str.charAt(0) === '-') && '-' || '';

    if (sign) {
        str = str.substr(1);
    }

    return sign + str.split('').reduceRight(function (result, char) {
       if (result.length % 4 === 0) {
           char += ',';
       }

       return char + result;
    }, '').slice(0, -1);
}

如果您将此函数提供给浮点数,它将被截断。

formatInteger(123456.123); // "123,456"
formatInteger(-1594504924) // "-1,594,504,924"

答案 3 :(得分:0)

另一种方式:

var nb = '-2000000';
nb = nb.split(/\B/).reduce(function(p, c, i, a) {
    return p + ((a.length-i)%3 ? c : ',' + c);
});