gotohayato.com

月(ダークモード)
太陽(ライトモード)

PHP で文字列が正の整数かどうかを判定する方法

2020/01/23PHP

PHP で 与えられた文字列が正の整数と解釈できるかどうかをチェックする方法 についてです。

尚 PHP のバージョン 7.3 で動作確認をしました。 バージョンが違うとそのまま使えないこともあると思うので、参考にされる際はご注意ください。

PHP だとこんな単純なことでも手間がかかるのがつらいところです。 PHP で数値をよく扱う人は Composer のパッケージを使って対応していたりするのでしょうか。

方法 1: filter_var() を使った方法

標準の関数をできるだけ使ってチェックする方法です。

function is_positive_integer_1($value) {
  $options = ['options' => ['min_range' => 1]];
  return is_int(filter_var($value, \FILTER_VALIDATE_INT, $options));
}

テスト:

// true
is_positive_integer_1('1');
is_positive_integer_1('5');
is_positive_integer_1(PHP_INT_MAX);
is_positive_integer_1((string) PHP_INT_MAX);
is_positive_integer_1(100);
is_positive_integer_1(true);

// false
is_positive_integer_1(false);
is_positive_integer_1(null);
is_positive_integer_1('hello');
is_positive_integer_1('512MB');
is_positive_integer_1('-3');
is_positive_integer_1('0');
is_positive_integer_1('10.0');
is_positive_integer_1('10.5');
is_positive_integer_1(PHP_INT_MAX + 1);
is_positive_integer_1('0744');
is_positive_integer_1('0x34');

注意点は、 boolean の true が渡されたときに true を返してしまうところです。 この挙動が嫌な場合は、引数の型をチェックする等して対応する必要があります。

方法 2: is_numeric()intval() を使った方法

function is_positive_integer_2($value) {
  return is_numeric($value) && intval($value) == $value && $value > 0;
}

テスト:

// true
is_positive_integer_2('1');
is_positive_integer_2('5');
is_positive_integer_2(PHP_INT_MAX);
is_positive_integer_2((string) PHP_INT_MAX);
is_positive_integer_2(100);
is_positive_integer_2('10.0');

// false
is_positive_integer_2(true);
is_positive_integer_2(false);
is_positive_integer_2(null);
is_positive_integer_2('hello');
is_positive_integer_2('512MB');
is_positive_integer_2('-3');
is_positive_integer_2('0');
is_positive_integer_2('10.5');
is_positive_integer_2(PHP_INT_MAX + 1);
is_positive_integer_1('0744');
is_positive_integer_1('0x34');

こちらの注意点は 10.0 のように、小数点以下がすべて 0 の小数点数に対して true を返してしまうところです。 この挙動が嫌な場合は、文字列内に . が含まれるかどうかのチェックを加えてやる必要があります。

ちなみに、 PHP の標準関数の is_int() (is_integer()) あたりが正数チェックに使えそうに一瞬思えますが、これは引数が string だと false を返してしまうので使えませんでした。

参考:


後藤隼人
ウェブサイト制作・ウェブアプリ開発やマーケティングをしています。
GitHub
© 2020 gotohayato.com
サイトについてタグアーカイブメッセージを送る