我来提出另一个解决方案。
首先是这个代码。
function formatNumber(number) {
if (number < 1000) {
return String(number);
}
if (number < 1000000) {
let numbers = String(number).split('');
numbers.splice(-3, 0, ',');
return numbers.join('');
}
if (number < 1000000000) {
let numbers = String(number).split('');
numbers.splice(-3, 0, ',');
numbers.splice(-7, 0, ',');
return numbers.join('');
}
if (number < 1000000000000) {
let numbers = String(number).split('');
numbers.splice(-3, 0, ',');
numbers.splice(-7, 0, ',');
numbers.splice(-11, 0, ',');
return numbers.join('');
}
throw new Error(`number: ${number} is too big`);
}
这段代码很冗长且不可扩展,但它很有效,因为它检查的是数字本身,而不是从数字转换而来的字符串的长度。
所以我基于这个想法转换成了简洁的代码。
(您可以将12
变得更大以防止错误。)
function formatNumber(number) {
let commas = -1;
for (let n3 = 3; n3 <= 12; n3 += 3) {
commas++;
const max = Math.pow(10, n3);
if (number < max) {
let numbers = String(number).split('');
for (let i = 0; i < commas; i++) {
numbers.splice(-(3 * (i + 1) + i), 0, ',');
}
return numbers.join('');
}
}
throw new Error(`number: ${number} is too big`);
}
Number.prototype.toLocaleString
在Safari浏览器中仍然不起作用。它只是返回数字本身,而没有错误抛出。由于这个问题,今天我感到非常无语... #goodworkApple - aendra