Javascript正则表达式:格式化货币

时间:2017-06-02 08:00:57

标签: javascript regex

我使用以下函数格式化数字:

function formatNumber(value, precision) {
    if (Number.isFinite(value)) {
        // Source: kalisjoshua's comment to VisioN's answer in the following stackoverflow question:
        // http://stackoverflow.com/questions/149055/how-can-i-format-numbers-as-money-in-javascript
        return value.toFixed(precision || 0).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")
    } else {
        return ""
    }
}

上述作品除一例外:

1130.000200 becomes 1,130.000,200

但我需要

1130.000200 become 1,130.000200

似乎我需要负面的后置?<!,即匹配一个前面没有点的数字,但是怎么样?

编辑:正如this question所述,Number.prototype.toLocaleString()对于较新的浏览器来说是一个很好的解决方案。我需要支持IE10,所以请留下这个问题。

3 个答案:

答案 0 :(得分:0)

只需在?匹配后删除.。更新的模式为/(\d)(?=(\d{3})+(?:\.\d+)$)/g,

  

?量词 - 在0到1次之间匹配,与之相同   可能,根据需要回馈

Demo regex and explanation

console.log('1130.000200'.replace(/(\d)(?=(\d{3})+(?:\.\d+)$)/g, "$1,"))

答案 1 :(得分:0)

使用下面的代码。

关键是匹配变量d的小数点。如果不匹配,请不要替换。

function formatNumber(value, precision) {
    var regex = /(\d)(?=(\d{3})+(?:(\.)\d+)?$)/g;
    return (+value).toFixed(precision || 0).replace(regex, function(a, b, c, d) {
            return d ? b+',' : b;
        });
}

console.log(formatNumber(1130.000200, 6));
console.log(formatNumber(1130, 6));

来自regex101的示例,您会在小组3中看到小数点匹配。https://regex101.com/r/qxriNx/1

答案 2 :(得分:-1)

您可以使用此简单函数格式化十进制数字:

function fmt(num) {
   // split into two; integer and fraction part
   var arr = num.match(/^(\d+)((?:\.\d+)?)$/);

   // format integer part and append fraction part
   return arr[1].replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') + arr[2];
}

var s1 = fmt('1130.000200')
//=> "1,130.000200"

var s2 = fmt('1130000200')
//=> "1,130,000,200"