タイトル: 数値のカンマ区切り(number_format)
SEOタイトル: PHP number_format (数値カンマ区切り) 完全ガイド|小数桁・通貨・Locale 対応
| この記事の要点 |
|
number_format の基本
会計画面・請求書・統計表示で「1234567 → 1,234,567」のようなカンマ区切りは事実上必須です。PHP では number_format() が定番ツール。
引数の全パターン
| 引数 | 意味 | 既定値 |
|---|---|---|
第 1: $num | 整形対象の数値 (int / float / 数値文字列) | 必須 |
第 2: $decimals | 小数桁数 | 0 |
第 3: $decimal_separator | 小数点記号 | '.' |
第 4: $thousands_separator | 千の位区切り記号 | ',' |
用途別レシピ
通貨表示 (日本円)
function yen(int $amount): string {
return '¥' . number_format($amount);
}
echo yen(1234567); // ¥1,234,567
echo yen(-500); // ¥-500
function yenSigned(int $amount): string {
$prefix = $amount >= 0 ? '+' : '';
return $prefix . '¥' . number_format($amount);
}
echo yenSigned(1000); // +¥1,000
echo yenSigned(-1000); // ¥-1,000
USD ($1,234.56)
function usd(float $amount): string {
return '$' . number_format($amount, 2);
}
echo usd(1234.5); // $1,234.50
echo usd(0.099); // $0.10 (四捨五入)
パーセント表示
function pct(float $rate, int $decimals = 1): string {
return number_format($rate * 100, $decimals) . '%';
}
echo pct(0.1234); // 12.3%
echo pct(0.05, 2); // 5.00%
echo pct(1, 0); // 100%
ファイルサイズ
function fileSize(int $bytes, int $decimals = 1): string {
$units = ['B', 'KB', 'MB', 'GB', 'TB'];
$i = 0;
while ($bytes >= 1024 && $i < count($units) - 1) {
$bytes /= 1024;
$i++;
}
return number_format($bytes, $decimals) . ' ' . $units[$i];
}
echo fileSize(1023); // 1,023.0 B
echo fileSize(1024 * 5); // 5.0 KB
echo fileSize(1024 * 1024 * 3); // 3.0 MB
丸めの挙動を制御する
number_format() は内部で四捨五入 (half away from zero) を行います。意図しない丸めを避けたければ事前に round() / floor() / ceil() を通す。
NumberFormatter (Intl 拡張) でロケール対応
「アプリの利用者のロケールに合わせて表記を変えたい」場合は NumberFormatter が最適です。Intl 拡張 (php-intl) が必要。
format($amount); // 1,234,567.89
$f = new NumberFormatter('de_DE', NumberFormatter::DECIMAL);
echo $f->format($amount); // 1.234.567,89 ドイツ式
$f = new NumberFormatter('fr_FR', NumberFormatter::DECIMAL);
echo $f->format($amount); // 1 234 567,89 フランス式
// 通貨表記 (記号自動)
$f = new NumberFormatter('ja_JP', NumberFormatter::CURRENCY);
echo $f->format($amount); // ¥1,234,568 (円は通常小数なし)
$f = new NumberFormatter('en_US', NumberFormatter::CURRENCY);
echo $f->format($amount); // $1,234,567.89
$f = new NumberFormatter('en_GB', NumberFormatter::CURRENCY);
echo $f->format($amount); // £1,234,567.89
// 通貨コードを明示
$f = new NumberFormatter('ja_JP', NumberFormatter::CURRENCY);
echo $f->formatCurrency($amount, 'USD'); // $1,234,567.89 (ja_JP の表記で USD)
// パーセント
$f = new NumberFormatter('ja_JP', NumberFormatter::PERCENT);
echo $f->format(0.1234); // 12%
$f->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 2);
echo $f->format(0.1234); // 12.34%
money_format() の代替
古い PHP の money_format() はPHP 7.4 で deprecated、8.0 で削除されました。NumberFormatter に置き換えます。
format(1234567);
JavaScript / Laravel との比較
JavaScript
// Intl.NumberFormat
new Intl.NumberFormat('ja-JP').format(1234567);
// → "1,234,567"
new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }).format(1234567);
// → "¥1,234,567"
new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(1234.5);
// → "1.234,50 €"
// 旧 toLocaleString も使える
(1234567).toLocaleString('ja-JP'); // "1,234,567"
Laravel Helper / Blade
// Laravel 10+ には Number ヘルパが追加
use Illuminate\Support\Number;
Number::format(1234567); // "1,234,567"
Number::format(1234.567, precision: 2); // "1,234.57"
Number::currency(1234.5, in: 'USD'); // "$1,234.50"
Number::currency(1234.5, in: 'JPY', locale: 'ja'); // "¥1,235"
Number::percentage(75.5); // "76%"
Number::fileSize(1024 * 1024 * 5); // "5 MB"
Number::ordinal(2); // "2nd"
// Blade
{{ number_format($order->total) }}
{{ Number::currency($order->total, 'JPY') }}
// 自前マクロも便利
@php
function yen($n) { return '¥' . number_format($n); }
@endphp
{{ yen(1234567) }}
大きい数 (整数オーバーフロー)
PHP の int は64bit プラットフォームで最大 9,223,372,036,854,775,807。これを超える場合、float 化される → number_format は内部で float→string 変換時に精度落ちのリスク。
FAQ
Q: 小数桁を「最大 2 桁、不要なゼロは省く」したい
A: number_format($n, 2) だと末尾ゼロが残ります。rtrim(rtrim(number_format($n, 2), '0'), '.') でゼロと小数点を消すか、NumberFormatter の MAX_FRACTION_DIGITS を使う。
Q: マイナス値の符号を括弧表記 (1,234) にしたい (会計式)
A: NumberFormatter::CURRENCY_ACCOUNTING スタイルや手書きで $n < 0 ? '(' . number_format(-$n) . ')' : number_format($n)。
Q: 数値文字列を渡すと警告が出る
A: PHP 8.x では完全な数値文字列のみ受け付けます。number_format('1234abc') は TypeError や非数値警告に。事前に (float) キャストか filter_var($x, FILTER_VALIDATE_FLOAT) でバリデーション。
Q: number_format(null) はどうなる?
A: PHP 8.1 以降は非推奨警告、8.x 後半でエラー化予定。number_format($x ?? 0) のように事前にデフォルト化を。