[PHP]小数点以下の末尾の0を取り除く方法

Read More

はい、シラサヤです。
最近は生活が充実し、かつ安定しつつある気がします。

長い人生の中においてなのでいずれまた浮き沈みはあると思うけど、
しばらくこの状況が続けばいいなあと思う今日この頃。のほほん。



--

さてさて、
タイトルに書いた「小数点以下の末尾の0を取り除く方法」についてだけど、
以下のような簡単な方法がある。


■小数点以下の末尾の0を取り除く
$cost = '1234.5000';
$cost = (float)$cost;
echo $cost;


動作結果
> 1234.5



はい、cast演算子を使ってfloat型に変換して変数に入れ直しているだけ。
これはわざわざ複数行で行わずとも、echoで出力する部分の1行で行っても構わない。
# cast演算子の代わりにfloatval()を使っても同じ結果を得ることができる


この方法が一番シンプルでわかりよいと思う。





--
同じことやってる人いるかなーと思って記事を書いたあとに少しググって調べてみたけど、
キーワードが悪かったのかHITするのはpreg_replace()を使う方法ばかりだった。

うーん、cast演算子は不人気なのだろうか…


しかもpreg_replace()のヤツを試してみたけどそのままだとちょっと不十分と感じた。

というのもpreg_replace()を使ったヤツは、元となる値に「小数点が必ず付く」という条件が必須となるから。


例を挙げる。

■preg_replace()をつかったパターンのマズイ挙動の例
$cost = '1234.5000';
$cost = preg_replace('/\.?0+$/', '', $cost);
echo $cost;  // ok 1234.5

$cost = '1200';
$cost = preg_replace('/\.?0+$/', '', $cost);
echo $cost;  // ng 12


上記をみればわかるように、1200の時の処理結果が12となっている。
何も考えずに使うとえらい目にあうこと必至。


ということで、
小数点以下の末尾0を除去するのにど~してもpreg_replace()を使いたいのならば一工夫入れる必要がありそう。


■preg_replace()に一工夫いれたもの
$cost = '1234.5000';
$cost = (preg_match('/\./', $cost)) ? preg_replace('/\.?0+$/', '', $cost) : $cost;
echo $cost;


preg_matchを使って小数点を判別させてやってる。
これなら整数値であってもnumber_format()と組み合わせても問題ない。


■number_format()とpreg_replace()の組み合わせたもの
$cost = '1234.5000';
$cost = number_format($cost, '2');	// 1,234.50
$cost = (preg_match('/\./', $cost)) ? preg_replace('/\.?0+$/', '', $cost) : $cost;
echo $cost;  // ok 1,234.5






--
小数点以下の末尾の0を取り除く方法 についてのまとめを書くと、
・普通に取り除くならcast演算子のfloatを使えばok。
・preg_replace()を使うならpreg_match()と組み合わせて使う(整数対策)。
・number_format()を使うのが前提ならfloatは使えない(数値じゃないから)。

まあnumber_format()を使うことが確定しているのなら、number_format()とpreg_replace()とpreg_match()とを組み合わせたものをあらかじめ関数化しておいたらいいね




どっかの誰かの参考にでもなれば