PHP の number_format() の逆を行う number_unformat() を作ったよ

PHP に number_format() という関数がありますね。
数値を渡したらカンマ区切りにフォーマットしてくれるやつ。

echo number_format(12345); //12,345

外部からデータを取ってきたときなどに
こういう形で整形済みのものが戻ってくることがあるので
この逆をやる関数を作りました。

使い方

基本的にはもうそのまんまで、
カンマ区切りフォーマットされた値を渡すだけ。

echo number_unformat('12,345'); //12345

戻り値の型

元の値に小数点がついていたら float で、
ついていなければ int で返します。

var_dump(number_unformat('12,345'));    //int(12345)
var_dump(number_unformat('9,999.99'));  //float(9999.99)

数字以外の文字が入っている場合

外部から受け取った値の頭に ¥ などがついていることがあるので
デフォルトでは頭についた数字以外の文字を無視して
強制的に数値として扱います。

echo number_unformat('\2,980'); //2980

値が数字以外の文字で始まっている時は別処理にしたいという場合は、
第2引数に false を与えておくと
頭についた数字以外の文字を無視するのをやめます。

この場合、そのまま数値にキャストすると 0 になってしまい
元が本当に 0 だったのか文字がついていたのかわからなくなるので
戻り値に false を返すようにしてあります。

var_dump(number_unformat('$1,999'));        //int(1999)
var_dump(number_unformat('$1,999'), false); //bool(false)
var_dump(number_unformat('1,999'), false);  //int(1999)

いずれの場合も、値の末尾にある数字以外の文字は無視されます。

区切り文字の指定

言語や地域によって数字フォーマットの区切り方が違うので
第3引数に小数点として使われている文字、
第4引数に千位の区切りとして使われている文字を指定できます。

//フランスではこう書くみたい。
echo number_unformat('1 234,56', true, ',', ' '); //1234.56

もともとやりたかったこと

使おうと思ったデータの数値に , が入ってただけなので
もともとやりたかったことをやるだけなら

str_replace(',', '', $number);

で十分なんだけど、ついカッとなって作った。

  • このエントリーをはてなブックマークに追加