phpのnumber_formatで、Message: A non well formed numeric value encounteredが出る場合

phpのnumber_format。

3桁で数値を区切ってくれるこの関数。超便利ですよね。

perlを中心に使っていた当時は、その楽さに驚きました。

でも、この関数、数字以外が入ってくると、とたんにエラーを吐くんです。

異常な例

$yen = "123456円";
$yen = number_format($yen);

こんなパターン。

そりゃそうです。仕様でもnumericを渡せとなっていますので(笑)

正規表現で処理する

perlだと、こんな正規表現で同じように処理できますので、

$yen = "123456円";
$yen =~ s/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/$1,/g;

phpでも次のように書いてあげれば幸せになれます。

$yen = preg_replace('/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/',  "$1,", $yen);

関数なりメゾットなりで対応

こんな感じの関数を作って、ヘルパー関数などで使うと汎用的に使えます。

public function number_format_org($val){
    return preg_replace('/(\d{1,3})(?=(?:\d\d\d)+(?!\d))/',  "$1,", $val);
}

久しぶりに、perlをいじっていて思い出したのでメモを残しておきました。