我正在尝试在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;
}
有没有更简单或更优雅的方法?如果它也可以与浮点数一起使用,那就太好了,但这不是必需的。在句点和逗号之间进行决策不需要特定于区域设置。
我使用了Kerry的回答中的想法,但是由于我只是为了自己的特定目的寻找简单的东西,所以简化了它。这是我所做的:
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function numberWithCommas(x) {
return x.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",");
}
function test(x, expect) {
const result = numberWithCommas(x);
const pass = result === expect;
console.log(`${pass ? "✓" : "ERROR ====>"} ${x} => ${result}`);
return pass;
}
let failures = 0;
failures += !test(0, "0");
failures += !test(100, "100");
failures += !test(1000, "1,000");
failures += !test(10000, "10,000");
failures += !test(100000, "100,000");
failures += !test(1000000, "1,000,000");
failures += !test(10000000, "10,000,000");
if (failures) {
console.log(`${failures} test(s) failed`);
} else {
console.log("All tests passed");
}
.as-console-wrapper {
max-height: 100% !important;
}
正则表达式使用2个前瞻性断言:
例如,如果传递它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(".");
}
function numberWithCommas(x) {
var parts = x.toString().split(".");
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return parts.join(".");
}
function test(x, expect) {
const result = numberWithCommas(x);
const pass = result === expect;
console.log(`${pass ? "✓" : "ERROR ====>"} ${x} => ${result}`);
return pass;
}
let failures = 0;
failures += !test(0 , "0");
failures += !test(0.123456 , "0.123456");
failures += !test(100 , "100");
failures += !test(100.123456 , "100.123456");
failures += !test(1000 , "1,000");
failures += !test(1000.123456 , "1,000.123456");
failures += !test(10000 , "10,000");
failures += !test(10000.123456 , "10,000.123456");
failures += !test(100000 , "100,000");
failures += !test(100000.123456 , "100,000.123456");
failures += !test(1000000 , "1,000,000");
failures += !test(1000000.123456 , "1,000,000.123456");
failures += !test(10000000 , "10,000,000");
failures += !test(10000000.123456, "10,000,000.123456");
if (failures) {
console.log(`${failures} test(s) failed`);
} else {
console.log("All tests passed");
}
.as-console-wrapper {
max-height: 100% !important;
}
@tjcrowder指出,现在JavaScript已经落后了支持信息,可以在正则表达式本身中解决它:
function numberWithCommas(x) {
return x.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",");
}
function numberWithCommas(x) {
return x.toString().replace(/\B(?<!\.\d*)(?=(\d{3})+(?!\d))/g, ",");
}
function test(x, expect) {
const result = numberWithCommas(x);
const pass = result === expect;
console.log(`${pass ? "✓" : "ERROR ====>"} ${x} => ${result}`);
return pass;
}
let failures = 0;
failures += !test(0, "0");
failures += !test(0.123456, "0.123456");
failures += !test(100, "100");
failures += !test(100.123456, "100.123456");
failures += !test(1000, "1,000");
failures += !test(1000.123456, "1,000.123456");
failures += !test(10000, "10,000");
failures += !test(10000.123456, "10,000.123456");
failures += !test(100000, "100,000");
failures += !test(100000.123456, "100,000.123456");
failures += !test(1000000, "1,000,000");
failures += !test(1000000.123456, "1,000,000.123456");
failures += !test(10000000, "10,000,000");
failures += !test(10000000.123456, "10,000,000.123456");
if (failures) {
console.log(`${failures} test(s) failed`);
} else {
console.log("All tests passed");
}
.as-console-wrapper {
max-height: 100% !important;
}
(?<!\.\d*)``.
后面有一个否定性的含义,表示匹配之前不能有零个或多个数字。至少在V8中,负向后看比split
和join
解决方案比较快。
问题内容: 我正在尝试在Python 2.6.1中打印一个整数,并以逗号作为千位分隔符。例如,我要将数字显示为。我将如何去做呢?我在Google上看到了很多示例,但是我正在寻找最简单的实用方法。 在句点和逗号之间进行决策不需要特定于区域设置。我希望尽可能简单一些。 问题答案: 不知道语言环境 区域感知
问题内容: 我有一个逗号分隔的字符串,我想将其转换为数组,因此可以循环遍历它。 有内置的功能吗? 例如,我有这个字符串 现在我想用逗号将其分割,然后将其存储在数组中。 问题答案: MDN参考,主要用于参数可能发生的意外行为。(提示:出来的不是。)
问题内容: 我有一个字符串,代表一个使用逗号分隔数千个数字的数字。如何在python中将其转换为数字? 在尝试进行转换之前,我可以将逗号替换为空字符串,但这感觉有点不对。有没有更好的办法? 问题答案:
问题内容: 我正在编写一段代码,该代码应该输出用逗号分隔的项目列表。该列表是通过for循环生成的。我用 问题是我不知道如何摆脱列表中最后一个条目添加的最后一个逗号。它输出以下内容: 如何删除结尾的’,’? 问题答案: 传递给 您几乎可以使用print语句。 不需要循环,print具有以及参数。 一点解释 所述内置需要作为要打印参数中的任何数量的项目。将打印所有非关键字参数,并用分隔。的默认值为单个
一、知识点 将数字每千分位用逗号隔开是指将数字格式化成字符串后,在每个千分位之后添加一个逗号,例如:12,345,678。 二、思路分析 要实现将数字每千分位用逗号隔开的功能,可以按照以下步骤进行: 将数字转换为字符串。 定义一个变量,用于存储当前已经处理过的字符的数量。 遍历字符串的每个字符,如果当前字符是数字,则将该字符添加到结果字符串中,并将当前已经处理过的字符的数量加1。 如果当前已经处理
我试图验证数字1-8的逗号分隔列表。