PHP の number_format は引数を自動的に round する(ただし若干の注意が必要)

あまり意識したことがなかったのでメモ。number_format 関数は、引数を自動的に四捨五入します。例えばこんな感じ。

<?php
for ($i = 0; $i <= 10; $i ++) {
    $val = 1000;
    $val = $val + $i * 0.1;
    var_dump($val);
    var_dump(number_format($val));
}
?>

この結果は、以下のようになります。

float(1000)
string(5) "1,000"
float(1000.1)
string(5) "1,000"
float(1000.2)
string(5) "1,000"
float(1000.3)
string(5) "1,000"
float(1000.4)
string(5) "1,000"
float(1000.5)
string(5) "1,001"
float(1000.6)
string(5) "1,001"
float(1000.7)
string(5) "1,001"
float(1000.8)
string(5) "1,001"
float(1000.9)
string(5) "1,001"
float(1001)
string(5) "1,001"

ただ、少し注意しなければならないのは、number_format の第二引数は、正の値しか取らないこと。

<?php
for ($i = 0; $i <= 10; $i ++) {
    $val = 1000;
    $val = $val + $i * 0.01;
    var_dump($val);
    var_dump(number_format($val, 1));
}
?>

これは期待通りに動作して

float(1000)
string(7) "1,000.0"
float(1000.01)
string(7) "1,000.0"
float(1000.02)
string(7) "1,000.0"
float(1000.03)
string(7) "1,000.0"
float(1000.04)
string(7) "1,000.0"
float(1000.05)
string(7) "1,000.1"
float(1000.06)
string(7) "1,000.1"
float(1000.07)
string(7) "1,000.1"
float(1000.08)
string(7) "1,000.1"
float(1000.09)
string(7) "1,000.1"
float(1000.1)
string(7) "1,000.1"

というように、小数第二位を四捨五入して表示してくれるのですが、 十の位で四捨五入してほしくて次のように書いても

<?php
for ($i = 0; $i <= 10; $i ++) {
    $val = 1000;
    $val = $val + $i;
    var_dump($val);
    var_dump(number_format($val, -1));
}
?>

結果は

int(1000)
string(5) "1,000"
int(1001)
string(5) "1,001"
int(1002)
string(5) "1,002"
int(1003)
string(5) "1,003"
int(1004)
string(5) "1,004"
int(1005)
string(5) "1,005"
int(1006)
string(5) "1,006"
int(1007)
string(5) "1,007"
int(1008)
string(5) "1,008"
int(1009)
string(5) "1,009"
int(1010)
string(5) "1,010"

となり、期待通りの結果にはなりません。round 関数の第二引数が負の値を取るのと違うので注意が必要です(マニュアルによると、number_format 関数の第二引数は「小数点以下の桁数」、round 関数の第二引数は「オプションで指定する、丸める桁数」とされています)。
したがって、十の位や百の位で四捨五入した結果を桁区切りにしたいときは、基本に戻って(?)

<?php
for ($i = 0; $i <= 10; $i ++) {
    $val = 1000;
    $val = $val + $i;
    var_dump($val);
    var_dump(number_format(round($val, -1)));
}
?>

のように記述する必要があります。こうすれば

int(1000)
string(5) "1,000"
int(1001)
string(5) "1,000"
int(1002)
string(5) "1,000"
int(1003)
string(5) "1,000"
int(1004)
string(5) "1,000"
int(1005)
string(5) "1,010"
int(1006)
string(5) "1,010"
int(1007)
string(5) "1,010"
int(1008)
string(5) "1,010"
int(1009)
string(5) "1,010"
int(1010)
string(5) "1,010"

期待通りの結果が得られます。

この記事を書いた人

グッドネイバー

“ Webに悩むお客さまの「よき隣人」でありたい ” をモットーに、Web システム開発(主に Laravel)、Web マーケティング支援の仕事をしています。詳しい業務内容はこちら。お仕事のご依頼・ご相談はこちらからお気軽にどうぞ。

PHP