この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:atom
更新日時:2026-06-11 07:10:02

タイトル: 数値のカンマ区切り(number_format)
SEOタイトル: PHP number_format (数値カンマ区切り) 完全ガイド|小数桁・通貨・Locale 対応

この記事の要点
  • PHP number_format() は数値を「人間向け表記」 (1,234,567) に整形する組込み関数。第 1 引数のみで 1234567 → "1,234,567"
  • 第 2 引数で小数桁数、第 3 引数で小数点記号、第 4 引数で千の位区切り記号を指定: ヨーロッパ形式 number_format($n, 2, ',', '.')
  • 丸めは四捨五入 (half away from zero)。銀行家丸めや切り捨てが欲しければ round()intdiv() と組合せ
  • Locale 対応・通貨記号付きNumberFormatter (Intl 拡張) を使う。例: $f->format(1234.5) で「¥1,235」など
  • 旧来の money_format() は PHP 7.4 で deprecated、8.0 で削除。NumberFormatter に移行する

number_format の基本

会計画面・請求書・統計表示で「1234567 → 1,234,567」のようなカンマ区切りは事実上必須です。PHP では number_format() が定番ツール。

<?php
echo number_format(1234567);           // 1,234,567
echo number_format(1234.5678);         // 1,235   (四捨五入)
echo number_format(0);                 // 0
echo number_format(-1234567);          // -1,234,567
echo number_format('1234567');         // 1,234,567 (文字列もOK)

引数の全パターン

引数意味既定値
第 1: $num整形対象の数値 (int / float / 数値文字列)必須
第 2: $decimals小数桁数0
第 3: $decimal_separator小数点記号'.'
第 4: $thousands_separator千の位区切り記号','
<?php
$n = 1234567.891;

// 小数 2 桁
echo number_format($n, 2);
// → 1,234,567.89

// 小数 4 桁
echo number_format($n, 4);
// → 1,234,567.8910

// 区切り文字を変える
echo number_format($n, 2, '.', ',');   // 1,234,567.89  (日本/英米)
echo number_format($n, 2, ',', '.');   // 1.234.567,89  (ヨーロッパ)
echo number_format($n, 2, ',', ' ');   // 1 234 567,89  (フランス)
echo number_format($n, 2, '.', '');    // 1234567.89    (区切りなし)
echo number_format($n, 0, '', "'");    // 1'234'568     (スイス)

用途別レシピ

通貨表示 (日本円)

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() を通す。

<?php
$n = 1234.5;

echo number_format($n, 0);                          // 1,235  四捨五入
echo number_format(floor($n), 0);                   // 1,234  切り捨て
echo number_format(ceil($n), 0);                    // 1,235  切り上げ
echo number_format(round($n, 0, PHP_ROUND_HALF_EVEN), 0); // 1,234 銀行家丸め

// 切り捨てを小数点指定
$n = 1234.987;
$cut2 = floor($n * 100) / 100;
echo number_format($cut2, 2);                       // 1,234.98 (切り捨て 2 桁)

NumberFormatter (Intl 拡張) でロケール対応

「アプリの利用者のロケールに合わせて表記を変えたい」場合は NumberFormatter が最適です。Intl 拡張 (php-intl) が必要。

<?php
$amount = 1234567.89;

// 数値表記
$f = new NumberFormatter('ja_JP', NumberFormatter::DECIMAL);
echo $f->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 に置き換えます。

<?php
// ❌ PHP 8.0 以降エラー
// setlocale(LC_MONETARY, 'ja_JP.UTF-8');
// echo money_format('%n', 1234567);

// ✅ NumberFormatter で
$f = new NumberFormatter('ja_JP', NumberFormatter::CURRENCY);
echo $f->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 変換時に精度落ちのリスク。

<?php
echo number_format(PHP_INT_MAX);
// 9,223,372,036,854,775,807

echo number_format(PHP_INT_MAX + 1);
// 9,223,372,036,854,775,808 程度。実際は float なので末尾が誤差

// 任意精度なら GMP / BCMath を使い、文字列レベルでカンマ挿入
function bigComma(string $num): string {
    $sign = ($num[0] === '-') ? '-' : '';
    if ($sign) $num = substr($num, 1);
    [$int, $frac] = array_pad(explode('.', $num, 2), 2, '');
    $int = strrev(implode(',', str_split(strrev($int), 3)));
    return $sign . $int . ($frac !== '' ? '.' . $frac : '');
}
echo bigComma('99999999999999999999999');
// 99,999,999,999,999,999,999,999

FAQ

Q: 小数桁を「最大 2 桁、不要なゼロは省く」したい
A: number_format($n, 2) だと末尾ゼロが残ります。rtrim(rtrim(number_format($n, 2), '0'), '.') でゼロと小数点を消すか、NumberFormatterMAX_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) のように事前にデフォルト化を。