Расставляй правильно приоритеты и не отвлекайся на мелочи

PHP: Как перевести байты в человеко-читаемый вид (КБ, МБ и т.д.)

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

Функция переводит числовые значения в байтах в удобочитаемый вид. Вот примеры вывода:

bytes2readable(1023); // 1023 Б
bytes2readable(10000); // 9.77 КБ
bytes2readable(123456789); // 117.74 МБ
bytes2readable(109951162776); // 102.4 ГБ
bytes2readable(9000511627776); // 8.19 ТБ
bytes2readable(5000511627776954); // 4.44 ПБ
bytes2readable(PHP_INT_MAX); // 8 ЭБ

А вот и сама функция:

<?php
/**
 * @param int $divisible Делимое, количество байт (неотрицательное  число)
 * @param int $divisor   Делитель (по умолчанию 1024)
 * @param int $precision Точность округления (цифр после запятой)
 *
 * @return string
 */
function bytes2readable(int $divisible, int $divisor = 1024, int $precision = 2): string {
    if ($divisible < 0) {
        return (string) $divisible;
    }

    $units = [ 'Б', 'КБ', 'МБ', 'ГБ', 'ТБ', 'ПБ', 'ЭБ' ];

    $iteration = 0;
    if ($divisible >= $divisor) {
        do {
            $divisible  /= $divisor;
            $iteration++;
        } while (floor($divisible) >= $divisor);
    }

    return sprintf('%s %s', round($divisible, $precision), $units[ $iteration ]);
}

Что мне не нравится в этой функции?

Она ограничена разрядностью системы, поэтому максимальное значение, которое мы можем корректно вычислить с ее помощью в архитектуре x64 равно 8 ЭБ (если необходимо работать с большими числами, то используем библиотеку BCMath, либо библиотеку GMP)

4 комментария на статью:
Ответить
Обязательные поля помечены *