27

Как форматировать число с запятыми в качестве разделителей тысяч?

17

Вопрос: Как вывести целое число в 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 ответ(ов)

0

Вам нужно отформатировать число с добавлением запятых для разделения тысяч. Вы можете использовать следующую функцию на 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)) находит цифры, за которыми следуют группы по три цифры, и заменяет их на саму цифру и запятую.

Таким образом, вы можете легко отформатировать любое число в нужном вам формате.

0

Я думаю, это самый короткий регулярное выражение, которое решает задачу:

/\B(?=(\d{3})+\b)/g

Используйте его следующим образом:

"123456".replace(/\B(?=(\d{3})+\b)/g, ",")

Я протестировал его на нескольких числах, и оно работает.

0

Вы можете использовать следующую процедуру для форматирования вашей валюты:

var nf = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
  minimumFractionDigits: 2,
  maximumFractionDigits: 2
});
nf.format(123456.789); // ‘$123,456.79’

Для получения дополнительной информации вы можете пройти по следующей ссылке:

Formatting Currency in JavaScript

0

Проблема с 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));

Этот код сначала проверяет, соответствует ли строковое представление числа его локализованному варианту. Если да, то он разбивает число на целую и дробную части, добавляет разделители тысяч и затем собирает всё обратно. Если локализованный метод доступен, он просто использует его. Надеюсь, это поможет!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь