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