我试图用逗号作为千位分隔符在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
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),它们在性能方面或多或少相同。