Как вернуть строку числа с 1 десятичным знаком и другие без десятичного знака?

В JS я хочу вывести строку с 1 десятичным знаком для определенных значений, в то время как другие будут целыми числами (например, 999999 = "999.9k", 500000 = "500k" и 1000000 = 1M). Вместо этого я получаю: 999999 = "1000.0k", 500000 = "500.0k" и 1000000 = 1.0M

Это то, что я пробовал:

function formatLargeNumber(n) {
  let s = "";
  if (n < 1000) {
    s += n;
  } else if (n >= 1000 && n < 1000000) {
    s += (Math.round(n)/1000).toFixed(1) + "k"
  } else if (n >= 1000000) {
    s += (Math.round(n)/1000000).toFixed(1) + "M"
  } 
  return s
};

Я пытался использовать Math.trunc, но он выводит такие значения, как 499999 равные 499.999k

Я мог бы сначала преобразовать результат в строку, разделить его на '.' символ и добавить некоторый оператор if else, хочу ли я отображать десятичное место, но я не уверен, как это записать.

Используйте toFixed() или toFixed(0). См. developer.mozilla.org/en-US/docs/web/javascript/reference/…

Jay Buckman 21.11.2022 19:52

@JayBuckman, похоже, это округляет числа, которые мне не нужны

thetalesofj 21.11.2022 20:20

Вопрос о том, должны ли вы указывать цифры с разной степенью точности, если они кратны 10, является предметом споров. Но если вы действительно хотите это сделать, вам понадобится условный код для работы с этими особыми случаями: например, вы можете просмотреть строку и удалить конечный «.0» (перед добавлением суффикса).

Chris Dennis 21.11.2022 21:01

Что ж, если вам не нужна десятичная дробь, не используйте .toFixed(1), но .toFixed(0) - я что-то упустил?

Bergi 21.11.2022 21:30

Кстати, вы, вероятно, не хотите округлять дважды. Не используйте Math.round, если toFixed уже выполняет округление.

Bergi 21.11.2022 21:31

Я думал сначала преобразовать результат в строку, разделить его на '.' символ и добавить оператор if else, хочу ли я отображать десятичное место

thetalesofj 22.11.2022 13:18

Для удаления десятичных знаков вы можете использовать что-то вроде .replace(/\.0$/,'') в конце

Samantha 22.11.2022 13:32
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
Хук useOnClickOutside в ReactJS
Хук useOnClickOutside в ReactJS
Как разработчик ReactJS, вы, возможно, сталкивались с ситуацией, когда вам нужно закрыть модальное или выпадающее меню, когда кто-то щелкает за его...
Хуки (часть-2) - useEffect
Хуки (часть-2) - useEffect
Хук useEffect - один из самых мощных и универсальных инструментов в арсенале разработчика React. Он позволяет вам управлять побочными эффектами в...
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
Простое руководство по тестированию взаимодействия с пользователем с помощью библиотеки тестирования React
В предыдущем посте я показал вам на примерах, как писать базовые тесты в React. Важнейшей частью пользовательского интерфейса приложений является...
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
Создайте титры как в звездных войнах с помощью CSS и Javascript
Создайте титры как в звездных войнах с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
0
7
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот что я нашел в https://www.codexworld.com/how-to/convert-file-size-bytes-kb-mb-gb-javascript/

// from https://www.codexworld.com/how-to/convert-file-size-bytes-kb-mb-gb-javascript/
function formatFileSize(bytes,decimalPoint) {
   if (bytes == 0) return '0 Bytes';
   var k = 1000,
       dm = decimalPoint || 2,
       sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
       i = Math.floor(Math.log(bytes) / Math.log(k));
   return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
}

[123,3347,2234556,12345342355,123423444332,234.5678e15].forEach(n=>console.info(formatFileSize(n,1)))

Индивидуальная версия скрипта, которая будет усекать десятичные цифры (вместо округления числа) после заданной длины, может выглядеть так:

// from https://www.codexworld.com/how-to/convert-file-size-bytes-kb-mb-gb-javascript/
function formatFileSize(bytes,decimalPoint) {
   if (bytes == 0) return '0 Bytes';
   var k = 1000,
       dm = decimalPoint || 2,
       sizes = ['', ' k', ' m', ' g', ' t', ' p', ' e', ' z', ' y'],
       i = Math.floor(Math.log(bytes) / Math.log(k));
   return parseFloat((bytes / Math.pow(k, i))).toFixed(8).slice(0,dm-8).replace(/\.0*$/,"") + sizes[i];
}

[123,3347,2234556,12993453455,123063444332,234.5678e15].forEach(n=>console.info(formatFileSize(n,1)))

Используя вышеупомянутое решение для создания фрагмента, удовлетворяющего требованиям OP, я хотел бы отметить, что способ расчета количества не соответствует фактическому определению единиц хранения (см. здесь). Коэффициент между единицами измерения должен быть равен 1024 (2^10) вместо 1000 (10^3).

Это эффективно при изменении размеров на ['', 'k', 'M'], но такие значения, как 999, 9999 и т. д., округляются и 999 999 = 1000 тыс.

thetalesofj 22.11.2022 16:01

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

Carsten Massmann 22.11.2022 21:40

Я знаю, я просто пытаюсь изменить его, чтобы он соответствовал результату, который мне нужен. Код работает очень хорошо, но значения <1000 имеют десятичную точку. Я посмотрю, как я могу изменить код, чтобы решить эту проблему.

thetalesofj 23.11.2022 21:24

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