В 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, хочу ли я отображать десятичное место, но я не уверен, как это записать.
@JayBuckman, похоже, это округляет числа, которые мне не нужны
Вопрос о том, должны ли вы указывать цифры с разной степенью точности, если они кратны 10, является предметом споров. Но если вы действительно хотите это сделать, вам понадобится условный код для работы с этими особыми случаями: например, вы можете просмотреть строку и удалить конечный «.0» (перед добавлением суффикса).
Что ж, если вам не нужна десятичная дробь, не используйте .toFixed(1), но .toFixed(0) - я что-то упустил?
Кстати, вы, вероятно, не хотите округлять дважды. Не используйте Math.round, если toFixed уже выполняет округление.
Я думал сначала преобразовать результат в строку, разделить его на '.' символ и добавить оператор if else, хочу ли я отображать десятичное место
Для удаления десятичных знаков вы можете использовать что-то вроде .replace(/\.0$/,'') в конце
Вот что я нашел в 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 тыс.
... чего и следовало ожидать от округления. Оценка репутации здесь, в SO, показана аналогичным образом.
Я знаю, я просто пытаюсь изменить его, чтобы он соответствовал результату, который мне нужен. Код работает очень хорошо, но значения <1000 имеют десятичную точку. Я посмотрю, как я могу изменить код, чтобы решить эту проблему.
Используйте toFixed() или toFixed(0). См. developer.mozilla.org/en-US/docs/web/javascript/reference/…