1. 導入
Webアプリケーションを開発していると、ファイルアップロード機能などで取得した「バイト単位の数値」を、ユーザーに見やすく表示する場面に多々遭遇します。例えば、「10485760バイト」と表示されても、ユーザーは直感的に容量を把握できません。これを「10.00MB」のように変換して表示することは、優れたUXを提供するための基本的な課題解決の一つです。本稿では、汎用的に利用可能なフォーマット関数を紹介します。
2. 基礎知識
コンピュータのデータ量は通常「バイト(Byte)」を基準としますが、1KB=1024バイトという2進数ベースの計算が一般的です。PHPの標準関数であるfilesize()などは、このバイト数を戻り値として返します。この数値を1024で繰り返し割ることで、KB、MB、GBといった単位へ昇格させることができます。数学的な手法としては、対数関数(log関数)を用いて「1024の何乗か」を求めるのが最も効率的です。
3. 実装/解決策
実務で利用する場合、以下の要件を満たす関数を作成するのが理想的です。
・小数点以下の桁数を指定できる(精度調整)。
・3桁ごとのカンマ区切りに対応する(視認性向上)。
・単位の境界を超えた場合(PB以上など)も考慮する。
これらを実現するために、log()関数で単位のインデックスを特定し、number_format()で整形を行うロジックを採用します。
4. サンプルプログラム
以下は、そのままプロジェクトにコピー&ペーストして利用できる実用的な関数です。
/
function byte_format($size, $dec = 2, $separate = true) {
$units = [‘B’, ‘KB’, ‘MB’, ‘GB’, ‘TB’, ‘PB’];
// 0の場合はそのまま返す
if ($size <= 0) return '0 B';
// 1024を底とした対数をとり、単位のインデックスを算出
$digits = floor(log($size, 1024));
// 定義された単位数を超える場合は最後の単位(PB)に合わせる
$max_index = count($units) - 1;
$index = min($digits, $max_index);
// 該当する単位で割って数値を算出
$num = $size / pow(1024, $index);
// 小数点以下の処理
$formatted_num = ($dec >= 0) ? sprintf(“%.{$dec}f”, $num) : (string)$num;
// カンマ区切りの適用
if ($separate) {
$formatted_num = number_format((float)$formatted_num, ($dec >= 0) ? $dec : 0);
}
return $formatted_num . ‘ ‘ . $units[$index];
}
// 使用例
echo byte_format(1024); // 1.00 KB
echo byte_format(109951162777600); // 100.00 TB
?>
5. 応用・注意点
注意すべきポイントとして、極端に大きな数値を扱う際は、PHPの環境設定(int型の最大値など)に依存する可能性があります。64bit環境であれば基本的に問題ありませんが、さらに巨大な数値を扱う場合はbcmath拡張の使用を検討してください。
また、実務では「1KB=1000バイト」として扱う業界(ストレージ業界など)と「1024バイト」として扱うOS・Web業界で定義が分かれることがあります。要件に応じて、1024の部分を1000に変更するなど、柔軟に調整を行ってください。