Как форматировать число с запятыми в качестве разделителей тысяч?
Вопрос: Как вывести целое число в 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;
}
console.log(numberWithCommas(1000));
Есть ли более простой или элегантный способ сделать это? Было бы неплохо, если бы это работало и с дробными числами, но это не обязательно. Также не нужно учитывать локализацию для выбора между точками и запятыми.
4 ответ(ов)
Вам нужно отформатировать число с добавлением запятых для разделения тысяч. Вы можете использовать следующую функцию на JavaScript:
function formatNumber(num) {
return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,");
}
console.log(formatNumber(2665)); // 2,665
console.log(formatNumber(102665)); // 102,665
console.log(formatNumber(111102665)); // 111,102,665
Функция formatNumber
преобразует число в строку и использует регулярное выражение, чтобы найти позиции, где необходимо вставить запятые. Регулярное выражение (\d)(?=(\d{3})+(?!\d))
находит цифры, за которыми следуют группы по три цифры, и заменяет их на саму цифру и запятую.
Таким образом, вы можете легко отформатировать любое число в нужном вам формате.
Я думаю, это самый короткий регулярное выражение, которое решает задачу:
/\B(?=(\d{3})+\b)/g
Используйте его следующим образом:
"123456".replace(/\B(?=(\d{3})+\b)/g, ",")
Я протестировал его на нескольких числах, и оно работает.
Вы можете использовать следующую процедуру для форматирования вашей валюты:
var nf = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
minimumFractionDigits: 2,
maximumFractionDigits: 2
});
nf.format(123456.789); // ‘$123,456.79’
Для получения дополнительной информации вы можете пройти по следующей ссылке:
Проблема с Number.prototype.toLocaleString()
, действительно, заключается в том, что не все браузеры (в частности, Safari) поддерживают её корректно. Я посмотрел на все другие ответы, но, похоже, никто не предложил полифилл для этой функции.
Вот пример кода, который является комбинацией первых двух ответов. Он использует встроенную toLocaleString
, если она доступна, и при отсутствии — применяет кастомную функцию для форматирования чисел:
var putThousandsSeparators;
putThousandsSeparators = function(value, sep) {
if (sep == null) {
sep = ',';
}
// проверяем, нужно ли форматировать
if (value.toString() === value.toLocaleString()) {
// разделяем дробные части
var parts = value.toString().split('.')
// форматируем целую часть
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, sep);
// собираем всё обратно
value = parts[1] ? parts.join('.') : parts[0];
} else {
value = value.toLocaleString();
}
return value;
};
alert(putThousandsSeparators(1234567.890));
Этот код сначала проверяет, соответствует ли строковое представление числа его локализованному варианту. Если да, то он разбивает число на целую и дробную части, добавляет разделители тысяч и затем собирает всё обратно. Если локализованный метод доступен, он просто использует его. Надеюсь, это поможет!
Как форматировать числа в виде строк валюты
Проверка десятичных чисел в JavaScript - IsNumeric()
Форматирование даты в JavaScript в виде yyyy-mm-dd
Как отсортировать массив целых чисел?
Как создать диалог с кнопками "Ок" и "Отмена"