PHP 版
<?php
function format($size) {
$sizetext = [' B', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB'];
$i = floor(log($size, 1024));
return round($size / pow(1024, $i), 2) . $sizetext[$i];
}
?>
C# 版
public string FormatSize(long size) {
if (size == 0) return "0 B";
string[] sizetext = { " B", " KB", " MB", " GB", " TB", " PB" };
int i = (int)Math.Floor(Math.Log(size, 1024));
return Math.Round(size / Math.Pow(1024, i), 2).ToString() + sizetext[i];
}
核心邏輯解析
log(size, 1024) 計算 size 以 1024 為底的對數,得到單位級數(0=B, 1=KB, 2=MB...)。
floor() 取整,確定單位索引 $i。
size / 1024^i 將大小換算為對應單位下的數值。
round(..., 2) 保留兩位小數。
- 陣列索引對應單位後綴。
對比總結
| 特性 | PHP | C# |
| 對數函數 | log($x, $base) | Math.Log(x, base) |
| 冪運算 | pow(1024, $i) | Math.Pow(1024, i) |
| 取整 | floor() | Math.Floor() |
| 四捨五入 | round($v, 2) | Math.Round(v, 2) |
| 類型 | 動態弱類型 | 強類型 (long/double) |
| 邊界處理 | 需額外判斷 0 | 显式 if (size==0) |
邊界與擴展
- size = 0:對數未定義,需單獨返回
"0 B"。
- 極大值:超過陣列長度時需
min($i, count($units)-1) 避免越界。
- 負數:文件大小不應為負,可取絕對值或拋出異常。
- 國際單位制 (SI):若需 1000 進制(kB/MB/GB),將底數改為 1000,單位改為 kB/MB/GB(大小寫區分)。