logo

Конвертация размера файла из байт в KB, MB, GB на JavaScript

Быстрый ответ

JS
Скопировать код
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 позволяет быстро преобразовать объём данных из байт в формат, более удобный для восприятия. Для задания точности используется второй аргумент.

Крайние случаи и отрицательные объёмы: Будьте героем, не забывайте про проверки

Мы прекрасно осознаем, что идеальные данные – редкость. Поясним нашу функцию, включив проверки не числовых значений, нулевого объёма данных и даже отрицательных объёмов – такие случаи редки, но они должны быть учтены.

JS
Скопировать код
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. Ведь возможность настройки всегда приветствуется.

JS
Скопировать код
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];
}

Минимизированная версия: Краткость – сестра таланта!

Поздоровимся с внутренним минималистом, представив минимизированную версию функции – это особенно актуально, когда каждый байт на счету.

JS
Скопировать код
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 страницы)Байты (Б)
📄 (Брошюра)Килобайты (КБ)
📖 (Роман)Мегабайты (МБ)
📚 (Энциклопедия)Гигабайты (ГБ)

Иногда нужны исходные данные: Не форматируйте всё

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

Быстро и просто: Упростим до однострочника

Если вам требуется быстро преобразовать объём данных из байт и выводить результат в консоль или использовать в скрипте, этот удобный "однострочник" для вас.

JS
Скопировать код
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]));

Расширяем рамки: Увеличиваем кругозор

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

Полезные материалы

  1. Преобразование размера файла в удобочитаемую строку на Stack Overflow — обсуждение различных методов преобразования размеров файлов.
  2. Единицы измерения информации на Википедии — детальная информация об единицах измерения данных.
  3. filesize на npm — npm пакет для удобного преобразования размеров файлов.
  4. pretty-bytes на GitHub — исходный код и примеры использования пакета pretty-bytes.
  5. Как числа кодируются в JavaScript — объяснение механизма кодирования чисел в JavaScript.
  6. Определения единиц СИ: бинарные префиксы на сайте NIST — обзор бинарных префиксов, используемых для измерения объёма данных.
  7. Спецификация языка ECMAScript® 2024 — официальная спецификация языка ECMAScript.