[php] 바이트를 킬로바이트, 메가 바이트, 기가 바이트로 포맷

시나리오 : 다양한 파일의 크기가 데이터베이스에 바이트로 저장됩니다. 이 크기 정보를 킬로바이트, 메가 바이트 및 기가 바이트로 포맷하는 가장 좋은 방법은 무엇입니까? 예를 들어 Ubuntu가 “5.2 MB (5445632 bytes)”로 표시하는 MP3가 있습니다. 웹 페이지에서 이것을 “5.2MB”로 표시하고 1MB 미만의 파일은 KB로 표시하고 1 기가 바이트 이상의 파일은 GB로 표시하는 방법은 무엇입니까?



답변

function formatBytes($bytes, $precision = 2) {
    $units = array('B', 'KB', 'MB', 'GB', 'TB');

    $bytes = max($bytes, 0);
    $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
    $pow = min($pow, count($units) - 1);

    // Uncomment one of the following alternatives
    // $bytes /= pow(1024, $pow);
    // $bytes /= (1 << (10 * $pow)); 

    return round($bytes, $precision) . ' ' . $units[$pow];
} 

( php.net 에서 가져온 다른 많은 예제가 있지만이 것이 가장 좋습니다 🙂


답변

이것은 Chris Jester-Young의 구현으로 php.net 및 정밀 인수와 결합하여 내가 본 것 중 가장 깨끗합니다.

function formatBytes($size, $precision = 2)
{
    $base = log($size, 1024);
    $suffixes = array('', 'K', 'M', 'G', 'T');

    return round(pow(1024, $base - floor($base)), $precision) .' '. $suffixes[floor($base)];
}

echo formatBytes(24962496);
// 23.81M

echo formatBytes(24962496, 0);
// 24M

echo formatBytes(24962496, 4);
// 23.8061M


답변

의사 코드 :

$base = log($size) / log(1024);
$suffix = array("", "k", "M", "G", "T")[floor($base)];
return pow(1024, $base - floor($base)) . $suffix;


답변

이것은 Kohana의 구현입니다.

public static function bytes($bytes, $force_unit = NULL, $format = NULL, $si = TRUE)
{
    // Format string
    $format = ($format === NULL) ? '%01.2f %s' : (string) $format;

    // IEC prefixes (binary)
    if ($si == FALSE OR strpos($force_unit, 'i') !== FALSE)
    {
        $units = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB');
        $mod   = 1024;
    }
    // SI prefixes (decimal)
    else
    {
        $units = array('B', 'kB', 'MB', 'GB', 'TB', 'PB');
        $mod   = 1000;
    }

    // Determine unit to use
    if (($power = array_search((string) $force_unit, $units)) === FALSE)
    {
        $power = ($bytes > 0) ? floor(log($bytes, $mod)) : 0;
    }

    return sprintf($format, $bytes / pow($mod, $power), $units[$power]);
}


답변

kb는 1024, mb는 1024 ^ 2, GB는 1024 ^ 3으로 나누면됩니다. 저것과 같이 쉬운.


답변

내 대안은 짧고 깨끗합니다.

/**
 * @param int $bytes Number of bytes (eg. 25907)
 * @param int $precision [optional] Number of digits after the decimal point (eg. 1)
 * @return string Value converted with unit (eg. 25.3KB)
 */
function formatBytes($bytes, $precision = 2) {
    $unit = ["B", "KB", "MB", "GB"];
    $exp = floor(log($bytes, 1024)) | 0;
    return round($bytes / (pow(1024, $exp)), $precision).$unit[$exp];
}

또는 더 어리 석고 효율적입니다.

function formatBytes($bytes, $precision = 2) {
    if ($bytes > pow(1024,3)) return round($bytes / pow(1024,3), $precision)."GB";
    else if ($bytes > pow(1024,2)) return round($bytes / pow(1024,2), $precision)."MB";
    else if ($bytes > 1024) return round($bytes / 1024, $precision)."KB";
    else return ($bytes)."B";
}


답변

짧은 코드를 원하면이 기능을 사용하십시오.

bcdiv ()

$size = 11485760;
echo bcdiv($size, 1048576, 0); // return: 10

echo bcdiv($size, 1048576, 2); // return: 10,9

echo bcdiv($size, 1048576, 2); // return: 10,95

echo bcdiv($size, 1048576, 3); // return: 10,953