协慌网

登录 贡献 社区

如何使用逗号作为千位分隔符在 JavaScript 中打印数字

我试图用逗号作为千位分隔符在JavaScript 中打印一个整数。例如,我想将数字 1234567 显示为 “1,234,567”。我该怎么做呢?

我是这样做的:

function numberWithCommas(x) {
    x = x.toString();
    var pattern = /(-?\d+)(\d{3})/;
    while (pattern.test(x))
        x = x.replace(pattern, "$1,$2");
    return x;
}

有更简单或更优雅的方式吗?如果它也适用于浮点数会很好,但这不是必需的。它不需要特定于语言环境来决定句点和逗号。

答案

我使用了克里答案中的想法,但简化了它,因为我只是为了我的特定目的而寻找简单的东西。这是我做的:

function numberWithCommas(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

这是你真正需要知道的。

@Neils Bom 询问了正则表达式的工作原理。我的解释有点长。它不适合评论,我不知道在哪里放,所以我在这里做。如果有人有任何其他建议,请告诉我。

正则表达式使用 2 个前瞻断言:一个正向查找字符串中的任何一个点,后面有一个 3 位数的倍数,以及一个负断言,以确保该点只有 3 个数字的倍数。替换表达式在那里放一个逗号。

例如,如果你传递它 “123456789.01”,正断言将匹配 7 左边的每个点(因为 “789” 是 3 位数的倍数,“678” 是 3 位数的倍数,“567”,等等。)。否定断言检查 3 位数的倍数后面没有任何数字。 “789”之后有一段时间,所以它正好是 3 位数的倍数,所以逗号就在那里。 “678”是 3 位数的倍数,但它后面有一个 “9”,所以这 3 个数字是一组 4 的一部分,逗号不会去那里。同样对于 “567”。 “456789” 是 6 位数,是 3 的倍数,所以在此之前使用逗号。 “345678” 是 3 的倍数,但它后面有一个 “9”,所以没有逗号。等等。 “\ B” 使正则表达式不会在字符串的开头加上逗号。

@ neu-rah 提到如果小数点后面有 3 位以上的数字,这个函数会在不受欢迎的地方添加逗号。如果这是一个问题,您可以使用此功能:

function numberWithCommas(x) {
    var parts = x.toString().split(".");
    parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    return parts.join(".");
}

我很惊讶没人提到Number.prototype.toLocaleString 。它是在 JavaScript 1.5(1999 年推出)中实现的,因此基本上支持主流浏览器。

var n = 34523453.345
n.toLocaleString()
"34,523,453.345"

通过包含Intl,它也适用于 v0.12 的 Node.js

注意这个函数返回字符串而不是数字

如果你想要不同的东西, Numeral.js可能会很有趣。

var number = 1234567890; // Example number to be converted

⚠请注意,javascript 的最大整数值为9007199254740991


toLocaleString

number.toLocaleString(); // "1,234,567,890"

// A more complex example: 
var number2 = 1234.56789; // floating point example
number2.toLocaleString(undefined, {maximumFractionDigits:2}) // "1,234.57"


NumberFormat (不支持Safari ):

var nf = new Intl.NumberFormat();
nf.format(number); // "1,234,567,890"

根据我的检查(至少是 Firefox),它们在性能方面或多或少相同。