PHP Tips | 文字列処理:フォーマット – 金額フォーマット(通貨記号付き)

PHP PHP
スポンサーリンク

「通貨記号付きの金額フォーマット」でやりたいことをイメージする

まず、ゴールのイメージからいきます。

1000        → "¥1,000"
1234567     → "¥1,234,567"
1234.5      → "¥1,234.50"(ドルなど小数ありの通貨)
1000        → "$1,000.00"

さっきやった「カンマ付き金額フォーマット」に、
「通貨記号(¥, $, € など)」をくっつけたい、という話です。

業務システムだと、ほぼ必ず出てきます。

請求書、見積書、売上レポート、ダッシュボード…
どこでも「数字だけ」より「通貨記号付き」の方が、パッと意味が伝わります。

ここでは、

  • 日本円(¥)のパターン
  • 外貨($, € など)のパターン
  • 通貨記号の位置(前に付けるか、後ろに付けるか)

を、PHP のユーティリティとして整理していきます。


ベースになるのは number_format(カンマ区切り)

まずは「数字をきれいにする」ことが先

通貨記号を付ける前に、
やるべきことは「数字を人間に読みやすくする」ことです。

ここは前回と同じで、number_format がベースになります。

echo number_format(1000);       // 1,000
echo number_format(1234567);    // 1,234,567
echo number_format(1234.5, 2);  // 1,234.50
PHP
  • 整数+カンマ → number_format($amount)
  • 小数2桁+カンマ → number_format($amount, 2)

この「カンマ付きの文字列」に、通貨記号をくっつける、という構造で考えるとシンプルです。


日本円(¥)の通貨記号付きフォーマット

一番よく使う形:「¥1,234」

日本の業務システムで一番よく見るのは、この形です。

¥1,000
¥123,456

PHP で素直に書くと、こうなります。

function formatYenWithSymbol(int|float|string $amount): string
{
    $formatted = number_format((float)$amount);

    return '¥' . $formatted;
}
PHP

使い方はこうです。

echo formatYenWithSymbol(1000);        // ¥1,000
echo formatYenWithSymbol("1234567");   // ¥1,234,567
PHP

ここでのポイントは二つです。

一つ目は、「数値 → カンマ付き文字列 → 通貨記号を前に付ける」という順番にしていること。
二つ目は、「通貨記号をベタ書きしている」ことです。

日本語システムで日本円だけを扱うなら、
これくらいシンプルで十分です。

「1,234円」のスタイルもよく使う

日本語 UI だと、¥1,234 ではなく 1,234円 と書くことも多いです。

function formatYenWithKanji(int|float|string $amount): string
{
    $formatted = number_format((float)$amount);

    return $formatted . '円';
}
PHP
echo formatYenWithKanji(1000);      // 1,000円
echo formatYenWithKanji(1234567);   // 1,234,567円
PHP

「どちらを使うか」はプロジェクトのデザインポリシー次第ですが、
ユーティリティとしては両方用意しておいてもいいくらいです。


外貨(ドル・ユーロなど)の通貨記号付きフォーマット

通貨記号を前に付けるパターン

ドルやユーロなどは、だいたいこういう形で表示します。

$1,234.50
€9,999.99

PHP でのユーティリティは、こう書けます。

/**
 * 通貨記号を前に付けて表示する(小数2桁)
 *
 * 例: 1234.5, '$' → "$1,234.50"
 */
function formatCurrencyWithSymbol(float|string $amount, string $symbol): string
{
    $formatted = number_format((float)$amount, 2, '.', ',');

    return $symbol . $formatted;
}
PHP

使い方の例です。

echo formatCurrencyWithSymbol(1234.5, '$');  // $1,234.50
echo formatCurrencyWithSymbol(9999.99, '€'); // €9,999.99
PHP

ここでの重要ポイントは、

  • 小数2桁を固定で表示している(number_format(..., 2, '.', ',')
  • 通貨記号は引数で受け取るようにしている

というところです。

通貨記号を引数にしておくと、
「通貨ごとに関数を増やさなくていい」というメリットがあります。

通貨記号を後ろに付けるパターン

一部の表記では、通貨記号を後ろに付けることもあります。

1,234.50 USD
9,999.99 EUR

その場合は、こういうユーティリティにしておくと使い回しやすいです。

/**
 * 通貨コードを後ろに付けて表示する(小数2桁)
 *
 * 例: 1234.5, 'USD' → "1,234.50 USD"
 */
function formatCurrencyWithCode(float|string $amount, string $code): string
{
    $formatted = number_format((float)$amount, 2, '.', ',');

    return $formatted . ' ' . $code;
}
PHP
echo formatCurrencyWithCode(1234.5, 'USD'); // 1,234.50 USD
echo formatCurrencyWithCode(9999.99, 'EUR'); // 9,999.99 EUR
PHP

「記号を前に」「コードを後ろに」など、
プロジェクトのルールに合わせて使い分けられるようにしておくと便利です。


入力値が「文字列の金額」のときの注意点

“1,234” をそのままフォーマットすると危険

フォーム入力などで、ユーザーがすでにカンマ付きで入力してくることがあります。

$_POST['amount'] = "1,234";
PHP

これをそのまま number_format に渡すと、こうなります。

echo number_format($_POST['amount']); // 1
PHP

"1,234" は「数字+カンマ」なので、
PHP は先頭の "1" だけを数値として解釈してしまいます。

通貨記号付きフォーマットでも同じ罠にはまるので、
必ず「カンマを取り除いてから数値にする」ステップを挟むべきです。

カンマを取り除いてからフォーマットするユーティリティ

/**
 * ユーザー入力の金額文字列(カンマ付きかも)を数値に変換する
 */
function parseAmount(string $raw): float
{
    $clean = str_replace(',', '', $raw);

    return (float)$clean;
}
PHP

これを組み合わせると、例えばこう書けます。

$raw    = $_POST['amount'] ?? '0';
$amount = parseAmount($raw);

echo formatYenWithSymbol($amount);
// "¥1,234" など
PHP

「入力 → 数値 → フォーマット」という流れを徹底すると、
金額周りのバグがかなり減ります。


実務での使いどころのイメージ

請求書・見積書の金額表示

$subtotal = 100000;
$tax      = 10000;
$total    = $subtotal + $tax;

echo "小計: " . formatYenWithSymbol($subtotal) . "\n";
echo "消費税: " . formatYenWithSymbol($tax) . "\n";
echo "合計: " . formatYenWithSymbol($total) . "\n";
PHP

出力イメージはこうなります。

小計: ¥100,000
消費税: ¥10,000
合計: ¥110,000

テンプレート側では「金額は必ず formatYenWithSymbol() を通す」と決めておくと、
表記が統一されて、読みやすさも一気に上がります。

外貨建てのレポート

$salesUsd = 12345.67;
$salesEur = 9876.54;

echo "Sales (USD): " . formatCurrencyWithSymbol($salesUsd, '$') . "\n";
echo "Sales (EUR): " . formatCurrencyWithSymbol($salesEur, '€') . "\n";
PHP
Sales (USD): $12,345.67
Sales (EUR): €9,876.54

通貨記号を引数にしておけば、
多通貨対応の画面でも同じ関数を使い回せます。


まとめ:今日からの「通貨記号付き金額フォーマット」ユーティリティ

大事なポイントだけ、ぎゅっとまとめます。

ベースは number_format
「カンマ付きの数字」を作ってから、
通貨記号や通貨コードを前後にくっつける、という構造にするとシンプルです。

日本円なら:

function formatYenWithSymbol(int|float|string $amount): string
{
    return '¥' . number_format((float)$amount);
}

function formatYenWithKanji(int|float|string $amount): string
{
    return number_format((float)$amount) . '円';
}
PHP

外貨なら:

function formatCurrencyWithSymbol(float|string $amount, string $symbol): string
{
    return $symbol . number_format((float)$amount, 2, '.', ',');
}

function formatCurrencyWithCode(float|string $amount, string $code): string
{
    return number_format((float)$amount, 2, '.', ',') . ' ' . $code;
}
PHP

タイトルとURLをコピーしました