どうも、kazuです。
Webエンジニアとして色んな現場を渡り歩いていると、ECサイトの改修なんかで「金額の表示を3桁区切りにしてほしい」っていう依頼、これ本当によく来るんですよね。
ぶっちゃけ、エンジニアからすれば「一瞬で終わるタスク」なんですけど、実はPHPの number_format 関数には、初心者がハマりやすい「型」の罠があったりします。
適当に実装して後から「計算が合わない!」なんて騒ぎにならないように、今日は僕が現場で実際に使っている「3桁区切り」の流儀を共有しますね。
執筆者:kazu |
|
結局、最強なのは「number_format」関数
PHPで数値を3桁区切りにするなら、基本的には number_format 関数一択です。
僕も9割以上の現場ではこれを使っています。コスパ最強ですからね。
まずは、一番シンプルな使い方を見てみましょう。
$price = 1280000;
// シンプルに3桁区切りにする
$formatted_price = number_format($price);
echo $formatted_price; // 結果: 1,280,000
このコードの動きを解説しますね。
変数 $price に入っている整数 1280000 を、number_format 関数に渡すだけです。
これだけで、自動的にカンマが挿入された文字列(String型)が返ってきます。
注意してほしいのは、「返ってくるのは数値じゃなくて文字列」という点です。
たまにこの関数の後に算術計算をしようとする猛者がいますが、カンマが入った時点でそれはもう「数字の形をした文字」なので、計算には使えません。
僕も新人の頃、これで型エラーを出した苦い記憶があります・・・。
小数点以下を制御する「第2引数」の流儀
ECサイトだけじゃなく、統計データなんかを扱う時は「小数点以下も出したい」っていうケースがあります。
そんな時は、number_format の第2引数で「何桁まで表示するか」を指定します。
$tax_rate = 1234.567;
// 小数点第2位まで表示する
$formatted_tax = number_format($tax_rate, 2);
echo $formatted_tax; // 結果: 1,234.57
第2引数に 2 を指定することで、小数点以下2桁までを強制的に表示します。
ここで注目してほしいのが、元の数値 .567 が .57 になっているところ。
そう、この関数は自動的に四捨五入をしてくれるんですよ。
「切り捨てにしたい」とか「切り上げにしたい」という厳密なルールがある現場では、number_format に渡す前に floor や ceil で数値を調整しておくのが、僕がいつもやっている安全策です。
大規模・グローバル案件なら「NumberFormatter」が正解
「日本国内向けのサイトなら number_format で十分だけど、外資系クライアントや多言語サイトはどうするの?」
こういう質問、個人的に大好きです。
実は、国によっては3桁区切りが「カンマ」じゃなくて「ドット」だったり、スペースだったりします。
そういった国際化(i18n)が必要な現場では、intl 拡張モジュールの NumberFormatter クラスを使います。
// 日本語・日本円の形式でフォーマットする
$formatter = new NumberFormatter('ja_JP', NumberFormatter::DECIMAL);
echo $formatter->format(5000000); // 結果: 5,000,000
// ドイツ形式(3桁区切りがドットになる)
$formatter_de = new NumberFormatter('de_DE', NumberFormatter::DECIMAL);
echo $formatter_de->format(5000000); // 結果: 5.000.000
このコード、ちょっと「プロ」っぽいですよね。
new NumberFormatter('ロケール', モード) を使ってインスタンスを作ります。
ロケールを de_DE(ドイツ)に変えるだけで、区切り文字のルールを自動で切り替えてくれるんです。
正直、個人ブログや小規模案件ではオーバースペックですが、「こいつ、ちゃんと国際化まで考えてるな」とクライアントに思わせるには最高の武器になりますよ。
【現場あるある】3桁区切りに「円」を足す時の注意点
現場でよく見る「残念なコード」に、number_format の結果に直接「円」を連結させて終わっているものがあります。
// kazuが現場で推奨する「可読性の高い」書き方
$price = 1500;
$display_price = "¥" . number_format($price) . " (税込)";
echo $display_price; // 結果: ¥1,500 (税込)
これ、何が重要か分かりますか?
ビュー(表示側)に渡す直前にフォーマットをかける、ということです。
DBから取得した数値を早い段階で number_format してしまうと、その後のロジックで数値として扱えなくなって詰みます。
「フォーマットは表示の直前」、これが僕が徹底しているマナーです。
まとめ:保守性を考えて手法を選ぼう
PHPで数値を3桁区切りにする方法をまとめます。
基本は number_format($value) でOK!
小数点を出すなら第2引数を忘れずに。四捨五入に注意!
グローバル案件なら NumberFormatter を検討する。
計算ロジックが終わった「表示直前」に変換するのが鉄則。
「たかがカンマ、されどカンマ」です。
ユーザーからすれば、3桁区切りがない金額表示ほど読みづらいものはありません。
UX(ユーザー体験)を向上させるためにも、適切なタイミングでサクッと実装できるようになっておきましょう。
以上、kazuでした。



コメント