number_formatで金額をきれいに整える
number_format とは、数値に三桁区切りのカンマを付けたり小数桁を整えたりして、文字列として返す関数です。金額表示の整形でよく使います。
桁区切りの基本
金額表示でおなじみの number_format、引数が省略されると小数点以下を切って三桁区切りのカンマを付けます。日本の金額表示ならこれで足りることが多いですね。返り値は文字列になる点だけ覚えておくと良いと思います。
echo number_format(1234567);
// "1,234,567"
echo number_format(1234.5);
// "1,235" 小数は四捨五入されて消える
小数桁と区切り文字を指定する
第2引数で小数点以下の桁数、第3引数で小数点記号、第4引数で桁区切り文字を指定できます。ヨーロッパ式の「ピリオドとカンマが逆」の表記や、区切りなしの表示もこれで作れます。
// 小数2桁まで
echo number_format(1234.5, 2);
// "1,234.50"
// 欧州式(小数はカンマ、区切りはピリオド)
echo number_format(1234567.89, 2, ',', '.');
// "1.234.567,89"
// 区切りなし
echo number_format(1000000, 0, '.', '');
// "1000000"
CSV に書き出すときなど、桁区切りを入れたくない場面もあるので、第4引数を空文字にできるのは覚えておくと便利ですね。
負の値と丸めの落とし穴
ここが実務でハマりやすいところです。number_format は四捨五入なので、切り捨てで合わせたい会計処理だと数字が合わなくなることがあります。丸めを厳密に制御したいなら、先に round や floor で意図した値を作ってから整形するのが安全だと思います。
// 四捨五入される
echo number_format(1234.567, 2); // "1,234.57"
// 切り捨てたいなら先に処理する
$floored = floor(1234.567 * 100) / 100;
echo number_format($floored, 2); // "1,234.56"
// -0 表示に注意。極小の負値が "-0" になることがある
$val = -0.001;
echo number_format($val, 2); // "-0.00" になりうる
「マイナスゼロ」が出るのは見た目に気持ち悪いので、表示直前にゼロ判定して符号を落とす、といった一手間を入れることがあります。金額まわりは丸め方針をチーム内で先に決めておくのが結局いちばん平和だと思います。
まとめ
number_format は桁区切りと小数整形をまとめて面倒みてくれる頼れる関数ですが、内部で四捨五入する点と、返り値が文字列である点は忘れないようにしたいところです。切り捨て運用や負のゼロといった細かい罠は、整形の前段で数値を確定させておく習慣で避けられると思います。
よくある質問
Q. 返り値は数値ですか、文字列ですか?
A. 文字列です。カンマ入りの文字列になるので、そのまま計算に使うと意図しない結果になります。整形は表示直前に行うのが安全です。
Q. 桁区切りを入れたくありません。
A. 第4引数に空文字を渡せば区切りなしになります。CSV への書き出しなど、カンマを入れたくない場面で便利です。
Q. 切り捨てで揃えたいです。
A. number_format は四捨五入なので、先に floor や round で意図した値を作ってから整形すると、会計処理でも数字がずれません。