PHPで整数値かどうかを調べる(糞コード)

知り合いからPHPってまともに整数値判定できないの?と質問された。

 

経緯は

知「PHPでフォームから取得した文字列を数値判定する関数調べたけど穴あるよね〜?」

私「いや、ctype_digit関数使うかpreg_match関数で正規表現使えばいいじゃん」

知「へ〜、正規表現使えないからctype_digit使ってみるわ。」

知「もちろんctype_digitって整数型も通すよね?」

私「えっ!?どうやったっけ!?」

Google検索でctype_digitのマニュアルを読むと

 

注意:

 

この関数を活用するには string を渡さなければなりません。 たとえば integer を渡すと、期待する結果にならない可能性があります。 HTML フォームに入力された整数値は、integer ではなく string 型で返されます。 マニュアルの  についての節を参照ください。

 

出典: http://php.net/manual/ja/function.ctype-digit.php

 

知「やっぱPHPってク○言○やな」

私「いや、まだ方法はある!!!」

 

 

と意地になった結果、整数型も文字列も10進数かどうかを判定してくれるコードが完成した。(糞コード)

 

まずは、PHPで登場する数値かどうかを判定する関数と欠点を紹介したい。

①is_int()

文字列を判定できない。

 

②is_numeric

小数点や16進数なども通す。

 

③ctype_digit

-128 から 255の整数値を入れるとFALSEを返す。

 

他にもあるかもしれないけど、私の知っている範囲で。。。

 

そこで私が書いたコードがこれだ。

(string)$num === (string)(int)$num

 

何をしているかと言うと

まず、(int)だが、文字列を整数値にキャストしれるものだ。

この型変換だが、少し癖がある。

というのも、"1a1"などの文字を含んだ数値をキャストすると、文字より手前の数値だけを返す。

 

例えば、"1a1"なら、1が返ってくる。

この癖を活かしている。

(string)$num === (string)(int)$num

この比較の右辺の値をまずキャストする、それを文字列に変換し直して

文字列にキャストした左辺の値と比べる。

 

$numが整数値の場合も、両辺とも文字列に変わるだけなのでTRUEが返る。

 

とまあ糞なコード書いてみました。

そして知人に完成したコードを見せたら、、、

知「正規表現コピペしたらいいし、このコードきもい」

と一蹴。

 

ふう、わけのわからんブログ書いてしまったなorz