Конвертация размера файла из байт в KB, MB, GB на JavaScript
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
function bytesToSize(bytes, precision = 2) {
if (bytes === 0) return '0 Байт';
const units = ['Байт', 'КБ', 'МБ', 'ГБ', 'ТБ'];
const index = Math.floor(Math.log(bytes) / Math.log(1024));
return (bytes / Math.pow(1024, index)).toFixed(precision) + ' ' + units[index];
}
// Пример использования
console.log(bytesToSize(1024)); // "1,00 КБ"
Функция bytesToSize
позволяет быстро преобразовать объём данных из байт в формат, более удобный для восприятия. Для задания точности используется второй аргумент.
Крайние случаи и отрицательные объёмы: Будьте героем, не забывайте про проверки
Мы прекрасно осознаем, что идеальные данные – редкость. Поясним нашу функцию, включив проверки не числовых значений, нулевого объёма данных и даже отрицательных объёмов – такие случаи редки, но они должны быть учтены.
function bytesToSize(bytes, precision = 2) {
if (typeof bytes !== 'number' || isNaN(bytes)) {
throw new Error('Ввод должен быть числом');
}
const sign = bytes < 0 ? '-' : '';
if (bytes === 0) return '0 Байт';
bytes = Math.abs(bytes);
const units = ['Байт', 'КБ', 'МБ', 'ГБ', 'ТБ'];
const index = Math.floor(Math.log(bytes) / Math.log(1024));
return sign + (bytes / Math.pow(1024, index)).toFixed(precision) + ' ' + units[index];
}
Расширенные варианты форматирования: Биты, байты, системы единиц SI или IEC
Дадим пользователям возможность выбирать между различными основаниями и системами единиц измерения SI и IEC. Ведь возможность настройки всегда приветствуется.
function bytesToSize(bytes, precision = 2, useSI = false) {
if (bytes === 0) return '0 Байт';
const factor = useSI ? 1000 : 1024;
const units = useSI
? ['Байт', 'КБ', 'МБ', 'ГБ', 'ТБ']
: ['Байт', 'КиБ', 'МиБ', 'ГиБ', 'ТиБ'];
const index = Math.floor(Math.log(bytes) / Math.log(factor));
return (bytes / Math.pow(factor, index)).toFixed(precision) + ' ' + units[index];
}
Минимизированная версия: Краткость – сестра таланта!
Поздоровимся с внутренним минималистом, представив минимизированную версию функции – это особенно актуально, когда каждый байт на счету.
const bTS=(b,p=2)=>b===0?'0 Байт':((u=['Байт','КБ','МБ','ГБ','ТБ']),(i=Math.floor(Math.log(b)/Math.log(1024))),((b/Math.pow(1024,i)).toFixed(p)+' '+u[i]));
Визуализация: 📃 -> 📚
Добавим жизни в статью с помощью эмоджи. Представим, что изменение размера файла аналогично увеличению объёма книги.
Толщина книги | Эквивалент |
---|---|
📃 (1-2 страницы) | Байты (Б) |
📄 (Брошюра) | Килобайты (КБ) |
📖 (Роман) | Мегабайты (МБ) |
📚 (Энциклопедия) | Гигабайты (ГБ) |
Иногда нужны исходные данные: Не форматируйте всё
В ряде случаев вам может потребоваться знать точное количество байт. Поэтому стоит отключать форматирование, когда нужно работать с исходными данными.
Быстро и просто: Упростим до однострочника
Если вам требуется быстро преобразовать объём данных из байт и выводить результат в консоль или использовать в скрипте, этот удобный "однострочник" для вас.
const bToS = b => b === 0 ? '0 Байт' : ((u = ['Байт', 'КБ', 'МБ', 'ГБ', 'ТБ']), (i = Math.floor(Math.log(b) / Math.log(1024))), ((b / Math.pow(1024, i)).toFixed(2) + ' ' + u[i]));
Расширяем рамки: Увеличиваем кругозор
В эпоху больших данных терабайты и петабайты уже не звучат так недосягаемо. Расширьте функциональность функции, добавив новые единицы измерения.
Полезные материалы
- Преобразование размера файла в удобочитаемую строку на Stack Overflow — обсуждение различных методов преобразования размеров файлов.
- Единицы измерения информации на Википедии — детальная информация об единицах измерения данных.
- filesize на npm — npm пакет для удобного преобразования размеров файлов.
- pretty-bytes на GitHub — исходный код и примеры использования пакета
pretty-bytes
. - Как числа кодируются в JavaScript — объяснение механизма кодирования чисел в JavaScript.
- Определения единиц СИ: бинарные префиксы на сайте NIST — обзор бинарных префиксов, используемых для измерения объёма данных.
- Спецификация языка ECMAScript® 2024 — официальная спецификация языка ECMAScript.