Как поставить запятую после 1-го числа для тысячных?

Добрый день! Я создал функцию, которая имитирует подсчет чисел. В итоге получил число без запятых.

Мой результат:

Что я хочу получить:

Мне нужно добавить запятую для тысячных, как в примере выше.

Код

let elements = document.querySelectorAll('#count-up-number');
  let time = 5;

  elements.forEach((element) => {
    element.textContent = '0';

    const updateCount = () => {
      const number = parseInt(element.getAttribute('data-value'));
      const value = +element.textContent;

      const increment = number / 200;
      if (value < number) {
        element.textContent = `${Math.ceil(value + increment)}`;
        setTimeout(updateCount, time);
      }
    }
    updateCount();
  })
 <span class = "card-number" id = "count-up-number" data-value = "2495">2,495</span>

Оформить заказ Intl.NumberFormat

vera. 21.02.2023 15:58

Селектор запроса с селектором идентификатора на самом деле не имеет смысла, потому что значения идентификатора элемента должны быть уникальными в документе. Вы получите список из нуля или одного элемента.

Pointy 21.02.2023 15:59
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему &apos;[] instanceof Object&apos; возвращает &quot;true&quot;?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
2
2
54
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете добиться этого, преобразовав число в строку локали.

const number = 2496;

const formattedNumber = number.toLocaleString("en-US");

console.info(formattedNumber); // 2,496

Использование Intl.NumberFormat справится с этим, а также со странами, которые используют . в качестве разделителя тысяч и другими региональными вариантами.

new Intl.NumberFormat().format(number);

Значение по умолчанию без указания конкретных параметров будет делать именно то, что вы хотите.

Не предлагайте Intl.NumberFormat, он работает некорректно

Alexsander 21.02.2023 16:04

Можно поподробнее, что работает не так?

NetByMatt 21.02.2023 16:07

Есть номер 3675. Это ожидаемый результат. Если я использую Intl.NumberFormat, я получаю 1008 вместо 3675.

Alexsander 21.02.2023 16:14

Это второстепенная проблема. Теперь вы считываете текущее значение в виде строки '1,008', а +value вернет NaN и вызовет ошибку в вашем коде. Я бы рекомендовал сохранять значение счетчика в атрибуте данных, например, конечное значение, во время каждой итерации, без международного форматирования.

NetByMatt 21.02.2023 16:19

Вот почему я не использую Intl.NumberFormat.

Alexsander 21.02.2023 16:39

Использование Intl.NumberFormat справится с этим, а также со странами, которые используют . в качестве разделителя тысяч и другими региональными вариантами.

new Intl.NumberFormat().format(number);

Значение по умолчанию без указания конкретных параметров будет делать именно то, что вы хотите для форматирования.

Однако это нарушит существующую реализацию, в которой вы используете +element.textContent для считывания отображаемого в данный момент значения. Как только вы достигнете значения> 1000, он больше не сможет анализировать значение из-за запятой. Вы можете обойти это, сохранив неформатированное значение в атрибуте элемента.

Обратите внимание, что html также был изменен, чтобы установить нулевое значение по умолчанию для data-count. Вы также можете поместить условие === undefined в функцию updateCount(), чтобы сделать то же самое во время холодного запуска.

let elements = document.querySelectorAll('#count-up-number');
  let time = 5;

  elements.forEach((element) => {
    element.textContent = '0';

    const updateCount = () => {
      const number = parseInt(element.getAttribute('data-value'));
      const value = parseInt(element.getAttribute('data-count'));

      const increment = number / 200;
      if (value < number) {
        const newValue = Math.ceil(value + increment);
        element.setAttribute('data-count', newValue);
        element.textContent = new Intl.NumberFormat().format(newValue);
        setTimeout(updateCount, time);
      }
    }
    updateCount();
  })
 <span class = "card-number" id = "count-up-number" data-value = "2495" data-count = "0">2,495</span>
Ответ принят как подходящий

Intl.NumberFormat и toLocaleString являются возможными решениями, как указывалось в других ответах. Поэтому мой ответ сосредоточен на том, как мы могли бы реализовать это более «сделай сам»:

var str = '9012345678';
while (str.length % 3) str = '0' + str;
console.info(str.match(/.{1,3}/g).map((x, i) => i ? x : parseInt(x)).join(","));

Объяснение:

  • если у нас есть число, нам нужно преобразовать его в строку, потому что мы говорим о строках, представляющих форматированные числа.
  • мы добавляем 0roes в начале нашей строки, пока она не будет делиться на 3, чтобы избежать запятой перед последней или предпоследней цифрой
  • мы разрезаем нашу строку на секции по 3 символа с помощью регулярного выражения
  • мы .map наши куски в себя, за исключением первого, который мы отображаем на его целочисленный корреспондент, чтобы избавиться от предыдущих 0roes
  • мы .join(",") наши куски, чтобы получить формат, который мы хотели иметь

Другие вопросы по теме