PHPで省略可能な小数点以下の0や小数点を削除する3つの方法

['12.34' | '12.30' | '12.00'] → ['12.34' | '12.3' | '12']みたいな編集をphpでやる方法を考えました。

よく、ほんとんどの値に小数点以下はないような時に「〜.00」が連続していると見づらいので「"〜.00"とか"〜.10"の小数点以下の省ける0は消してよ」と要望されたりします。そういう時の解決方法です。

1. floatvalを使う方法

戻り値がfloat型になるので比較する際は注意してください。場合によってはstring型に変換する必要があるかもしれません。

print '12340      -> '. floatval(12340);      // 12340      -> 12340
print '12340.00   -> '. floatval(12340.00);   // 12340.00   -> 12340
print '123.40:    -> '. floatval(123.40);     // 123.40     -> 123.4
print '0.1234:    -> '. floatval(0.1234);     // 0.1234     -> 0.1234
print '0.123400   -> '. floatval(0.123400);   // 0.123400   -> 0.1234
print '0.001234   -> '. floatval(0.001234);   // 0.001234   -> 0.001234
print '0.00123400 -> '. floatval(0.00123400); // 0.00123400 -> 0.001234

2. rtrimを使う方法

「変換する値がstring型」で「必ず小数点があること」と条件がありますが、rtrimでできます。条件を満たさないと整数部の必要な0を削除してしまうので注意。

データベースのデータ型がNUMERIC(8,3)みたいに必ず小数点があるようなときに使ったりします。

メリットとしてはstring型のデータが取得できることです。

print '12340      -> '. rtrim(rtrim('12340',     '0'),'.'); // 12340      -> 1234	NG!!
print '12340.00   -> '. rtrim(rtrim('12340.00',  '0'),'.'); // 12340.00   -> 12340
print '123.40     -> '. rtrim(rtrim('123.40',    '0'),'.'); // 123.40     -> 123.4
print '0.1234     -> '. rtrim(rtrim('0.1234',    '0'),'.'); // 0.1234     -> 0.1234
print '0.123400   -> '. rtrim(rtrim('0.123400',  '0'),'.'); // 0.123400   -> 0.1234
print '0.001234   -> '. rtrim(rtrim('0.001234',  '0'),'.'); // 0.001234   -> 0.001234
print '0.00123400 -> '. rtrim(rtrim('0.00123400','0'),'.'); // 0.00123400 -> 0.001234

/*
 * カンマ区切も設定
 * number_formatで小数点以下の0を出力するので、上でNGだった'12340'も変換できる。
 * /
print '12340:   -> '. rtrim(rtrim(number_format('12340',   4), '0'),'.'); // 12340    -> 12,340
print '12340.00 -> '. rtrim(rtrim(number_format('12340.00',4), '0'),'.'); // 12340.00 -> 12,340

3. 正規表現を使う方法

これも「string型」で「必ず小数点があること」の条件があります。

正規表現の記述を工夫すれば小数点の有無はなんとかできそうな気もしますが、実行スピードやソースの読みやすさを考えると他の方法に対してメリットが無いのでこれ以上追求していません。(他のサイトからコピってきてそのまま)

$ptrn = '/\.?0+$/';
print '12340      -> '. preg_replace($ptrn, '', '12340');      // 12340      -> 1234;	NG!!
print '12340.00   -> '. preg_replace($ptrn, '', '12340.00');   // 12340.00   -> 12340;
print '123.40     -> '. preg_replace($ptrn, '', '123.40');     // 123.40     -> 123.4;
print '0.1234     -> '. preg_replace($ptrn, '', '0.1234');     // 0.1234     -> 0.1234;
print '0.123400   -> '. preg_replace($ptrn, '', '0.123400');   // 0.123400   -> 0.1234;
print '0.001234   -> '. preg_replace($ptrn, '', '0.001234');   // 0.001234   -> 0.001234;
print '0.00123400 -> '. preg_replace($ptrn, '', '0.00123400'); // 0.00123400 -> 0.001234;

4. TODO

  • 0を単純に削除よりも「12340   (スペース置換)」した方が桁合わせで都合がいい?
  • スペース置換よりも「12340<span style=“color:#fff;">.00</span>(0非表示)」した方が文字幅で悩まなくていい?
  • 0非表示するとして背景色と合わせるのはどうする? 新しいブラウザ限定なら透明色が使える?
  • ブラウザのJavaScriptで実装できたらベスト。class=“num-del0"だと不要0を透明化とか…