gpt4 book ai didi

javascript - 如何在 JavaScript 中用逗号打印一个数字作为千位分隔符

转载 作者:bug小助手 更新时间:2023-10-28 10:41:45 25 4
gpt4 key购买 nike

我正在尝试在 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;
}

有没有更简单或更优雅的方法来做到这一点?如果它也适用于 float 会很好,但这不是必需的。在句点和逗号之间决定不需要特定于语言环境。

最佳答案

我使用了 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 个前瞻断言:

  • 一个正数,用于查找字符串中后面连续有 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(".");
}

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;
}

@t.j.crowder 指出,现在 JavaScript 有lookbehind(support info),可以在正则表达式本身解决:

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*) 是一个否定的lookbehind,表示匹配项前面不能有 . 后跟零个或多个数字。至少在 V8 中,负向lookbehind 比 splitjoin 解决方案 (comparison) 更快。

关于javascript - 如何在 JavaScript 中用逗号打印一个数字作为千位分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2901102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com