首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 檔案大小格式化顯示:遞迴單位轉換、支援 B/KB/MB/GB/TB/PB/EB/ZB/YB

     編輯:PHP 綜合知識

在網頁顯示檔案大小或流量統計時,原始位元組數字難以閱讀。本文提供一個 formatSize() 遞迴函式,自動依大小切換單位 (B、KB、MB...ZB),保留兩位小數,程式碼簡潔易懂,附帶完整單位對照表與擴充建議。

核心函式 formatSize()

<?php
/**
 * 格式化位元組大小為人類可讀字串
 * @param int|float $bytes  位元組數
 * @param int       $times  遞迴層級 (內部使用,外部呼叫請忽略)
 * @return string  如 "19.71 MB"
 */
function formatSize($bytes, $times = 0) {
    if ($bytes >= 1024) {
        return formatSize($bytes / 1024, $times + 1);
    }

    $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    $unit = $units[$times] ?? '未知單位';

    return sprintf('%.2f %s', $bytes, $unit);
}

// === 使用範例 ===
echo formatSize(20667564) . "\n";      // 19.71 MB
echo formatSize(1024) . "\n";          // 1.00 KB
echo formatSize(1536) . "\n";          // 1.50 KB
echo formatSize(1073741824) . "\n";    // 1.00 GB
echo formatSize(0) . "\n";             // 0.00 B
echo formatSize(500) . "\n";           // 500.00 B
?>

單位換算對照表 (IEC 1024 進制)

單位符號倍數 (1024^n)約略十進制中文唸法
位元組B1024^01位元組
千位元組KB / KiB1024^11,024千 / 奇
百萬位元組MB / MiB1024^21,048,576兆 / 百萬
十億位元組GB / GiB1024^31,073,741,824吉 / 十億
兆兆位元組TB / TiB1024^41.0995e12太 / 兆兆
拍位元組PB / PiB1024^51.1259e15拍 / 千兆兆
艾位元組EB / EiB1024^61.1529e18艾 / 百萬兆兆
澤位元組ZB / ZiB1024^71.1806e21澤 / 十億兆兆
堯位元組YB / YiB1024^81.2089e24堯 / 兆兆兆兆

註:國際標準建議使用 KiB、MiB、GiB (1024 進制) 與 KB、MB、GB (1000 進制) 區分,實務上常混用,請依專案規範決定。

進階版:支援 1000 進制 (SI) 與 1024 進制 (IEC) 切換

<?php
function formatSizeAdvanced($bytes, $binary = true, $decimals = 2) {
    if ($bytes == 0) return '0 B';

    $system = $binary ? 1024 : 1000;
    $suffix = $binary ? ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']
                      : ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];

    $exp = (int)floor(log($bytes, $system));
    $exp = min($exp, count($suffix) - 1);

    $value = $bytes / pow($system, $exp);
    return round($value, $decimals) . ' ' . $suffix[$exp];
}

// 1024 進制 (預設)
echo formatSizeAdvanced(1536) . "\n";    // 1.5 KiB
// 1000 進制 (硬碟廠商常用)
echo formatSizeAdvanced(1536, false) . "\n"; // 1.54 KB
?>

效能優化:避免遞迴改用迴圈

<?php
function formatSizeLoop($bytes, $decimals = 2) {
    $units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
    $i = 0;
    while ($bytes >= 1024 && $i < count($units) - 1) {
        $bytes /= 1024;
        $i++;
    }
    return round($bytes, $decimals) . ' ' . $units[$i];
}
// 效能較佳,適合大量資料格式化 (如檔案列表數千筆)
?>

常見應用場景

  • 檔案上傳進度顯示:formatSize($uploaded) . ' / ' . formatSize($total)
  • 磁碟空間統計儀表板
  • API 回應傳輸量記錄
  • 資料庫備份檔案大小報表
  • CDN 流量計費依據顯示

國際化 (i18n) 擴充

<?php
function formatSizeI18n($bytes, $locale = 'zh_TW') {
    $units = [
        'zh_TW' => ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
        'zh_CN' => ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
        'en_US' => ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
        'ja_JP' => ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
    ];
    $unitList = $units[$locale] ?? $units['en_US'];
    $i = 0;
    while ($bytes >= 1024 && $i < count($unitList) - 1) {
        $bytes /= 1024;
        $i++;
    }
    return number_format($bytes, 2, '.', '') . ' ' . $unitList[$i];
}
?>

將此函式納入專案共用工具庫,統一全站檔案大小顯示格式,提升使用者體驗與程式碼一致性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved