Лучший способ проверить положительное целое число (PHP)?

Мне нужно проверить, что входное значение формы является положительным целым числом (а не просто целым числом), и я заметил еще один фрагмент кода, используя следующий код:

$i = $user_input_value; if (!is_numeric($i) || $i < 1 || $i != round($i)) { return TRUE; } 

Мне было интересно, есть ли преимущество в использовании трех проверок выше, вместо того, чтобы делать что-то вроде этого:

 $i = $user_input_value; if (!is_int($i) && $i < 1) { return TRUE; } 

разница между двумя фрагментами кода заключается в том, что is_numeric($i) также возвращает значение true, если $ i является числовой строкой , но is_int($i) возвращает true, если $ i является целым числом, а не если $ i – целая строка . Вот почему вы должны использовать первый фрагмент кода, если вы также хотите вернуть значение true, если $ i – целочисленная строка (например, если $ i == "19", а не $ i == 19).

См. Эти ссылки для получения дополнительной информации:

Функция php is_numeric

Функция php is_int

Не уверен, почему нет предложения использовать filter_var. Я знаю, что это старая нить, но, возможно, это поможет кому-то (в конце концов, я оказался здесь, верно?).

 $filter_options = array( 'options' => array( 'min_range' => 0) ); if( filter_var( $i, FILTER_VALIDATE_INT, $filter_options ) !== FALSE) { ... } 

Вы также можете добавить максимальное значение.

 $filter_options = array( 'options' => array( 'min_range' => 0, 'max_range' => 100 ) ); 

http://php.net/manual/en/function.filter-var.php

http://www.php.net/manual/en/filter.filters.validate.php

Лучший способ проверить положительные целые числа, когда переменная может быть INTEGER или STRING, представляющая целое число:

  if ((is_int($value) || ctype_digit($value)) && (int)$value > 0 ) { // int } 

is_int() вернет true, если тип значения является integer . ctype_digit() вернет true, если тип является string но значение строки является целым числом.

Разница между этой проверкой и is_numeric() заключается в том, что is_numeric() вернет true даже для значений, которые представляют числа, которые не являются целыми (например, «+0.123»).

Это определенно направляется к земле микро-оптимизации, но эй: код, который я работаю на жевание через миллионы предметов каждый день, и это пятница. Поэтому я немного экспериментировал …

 for ($i = 0; $i < 1000000; $i++) { // Option 1: simple casting/equivalence testing if ((int) $value == $value && $value > 0) { ... } // Option 2: using is_int() and ctype_digit(). Note that ctype_digit implicitly rejects negative values! if ((is_int($value) && $value > 0) || ctype_digit($value)) { ... } // Option 3: regular expressions if (preg_match('/^\d+$/', $value)) { ... } } 

Затем я выполнил вышеуказанные тесты как для целых, так и для строковых значений

Вариант 1: простое испытание литья / эквивалентности

  • Целое число: 0,3 с
  • Строка: 0,4 с

Вариант 2: использование is_int () и ctype_digit ()

  • Целое число: 0,9 с
  • Строка: 1.45s

Вариант 3: регулярные выражения

  • Целое число: 1,83 с
  • Строка: 1,60 с

Возможно, неудивительно, что вариант 1, безусловно, самый быстрый, так как нет вызовов функций, просто кастинг. Также стоит отметить, что в отличие от других методов, параметр 1 рассматривает значение string-float-integer «5.0» как целое число:

 $valList = array(5, '5', '5.0', -5, '-5', 'fred'); foreach ($valList as $value) { if ((int) $value == $value && $value > 0) { print "Yes: " . var_export($value, true) . " is a positive integer\n"; } else { print "No: " . var_export($value, true) . " is not a positive integer\n"; } } Yes: 5 is a positive integer Yes: '5' is a positive integer Yes: '5.0' is a positive integer No: -5 is not a positive integer No: '-5' is not a positive integer No: 'fred' is not a positive integer 

Независимо от того, хорошо ли это для вашего конкретного случая использования, остается как упражнение для читателя …

Другой лучший способ проверить число Integer – использовать регулярное выражение. Вы можете использовать следующий код для проверки значения Integer. Он будет ложным для значений float.

 if(preg_match('/^\d+$/',$i)) { // valid input. } else { // invalid input. } 

Лучше, если вы можете проверить, действительно ли $ i> 0.

В дополнение ко всем остальным ответам: вы, вероятно, ищете ctype_digit . Он ищет строку, содержащую только цифры.

Определение:

 !A = !is_numeric($i) B = $i < 1 !C = $i != round($i) 

Затем…

! is_numeric ($ i) || $ i <1 || $ i! = round ($ i) равно ! A || B || ! C

Так:

 !A || B || !C = !A || !C || B 

Теперь, используя теорему deMorgan, т. Е. (! A ||! C) = (A && C), тогда:

 !A || !C || B = (A && C) || B 

Обратите внимание, что A && C = is_numeric ($ i) && $ i == round ($ i), но если $ i == round ($ i) TRUE, то is_numeric ($ i) тоже ИСТИНА, поэтому мы можем упростить A && C = C, поэтому,

(A && C) || B = C || B =

 $i == round($i) || $i < 1 

Поэтому вам просто нужно использовать:

 $i = $user_input_value; if ($i == round($i) || $i < 1) { return TRUE; } 

Laravel 4.2 Правило проверки для положительного числа

Он принимает только положительные числа, включая значения float.

 public static $rules = array( 'field_name' => 'required|regex:/^\d*\.?\d*$/' ); 

например: 20,2.6,06

В первом примере используется round чтобы проверить, что вход представляет собой целое число, а не другое числовое значение (т. Е. Десятичное число).

is_int вернет false, если передал строку. См. Примеры руководства PHP для is_int

  preg_match('{^[0-9]*$}',$string)) 

и если вы хотите ограничить длину:

  preg_match('{^[0-9]{1,3}$}',$string)) //minimum of 1 max of 3 

Таким образом, pisitive int с максимальной длиной 6:

  if(preg_match('{^[0-9]{1,6}$}',$string)) && $string >= 0) 

Вам не нужно использовать все три проверки, и если вы хотите получить положительное целое число, которое вы, возможно, захотите сделать противоположным тому, что находится в вашем коде:

 if(is_numeric($i) && $i >= 0) { return true; } 

Проверьте ответ Sören для получения дополнительной информации о различии между is_int() и is_numeric()

Чтобы проверить положительное целочисленное использование:

 $i = $user_input_value; if (is_int($i) && $i > 0) { return true; //or any other instructions } 

ИЛИ

 $i = $user_input_value; if (!is_int($i) || $i < 1) { return false; //or any other instructions } 

Используйте ту, которая соответствует вашей цели, поскольку они одинаковы. Следующие примеры демонстрируют разницу между is_numeric() и is_int() :

 is_numeric(0); // returns true is_numeric(7); // returns true is_numeric(-7); // returns true is_numeric(7.2); // returns true is_numeric("7"); // returns true is_numeric("-7"); // returns true is_numeric("7.2"); // returns true is_numeric("abc"); // returns false is_int(0); // returns true is_int(7); // returns true is_int(-7); // returns true is_int(7.2); // returns false is_int("7"); // returns false is_int("-7"); // returns false is_int("7.2"); // returns false is_int("abc"); // returns false 

Все эти ответы не учитывают тот факт, что запросчик может проверить ввод формы.
Ошибка is_int () не будет выполнена, потому что вход формы является строкой.
is_numeric () будет истинным также для чисел с плавающей точкой.
Вот почему встречается $ i == round ($ i), поскольку он проверяет, что вход является целым числом.

Хорошо, я знаю, что эта ветка действительно старая, но я разделяю мнение Джэффри Вдовяка: поскольку я смог ее найти, это могло бы помочь кому-то другому.

Возможно, еще один простой способ проверить gmp_sign () в php. Он работает для целых и числовых строк и возвращает 1, если a положителен, -1, если a отрицательный, и 0, если a равно нулю.

Так:

 // positive echo gmp_sign("500") . "\n"; // negative echo gmp_sign("-500") . "\n"; // zero echo gmp_sign("0") . "\n"; 

выведет:

 1 -1 0 

См. Руководство по функциям на странице http://php.net/manual/en/function.gmp-sign.php

PS Вам нужно будет включить php_gmp.dll в вашем .ini-файле.

 if(preg_match('/^[1-9]\d*$/',$i)) { //Positive and > 0 } 

Вместо проверки string int OR с несколькими условиями, такими как:

 if ( ctype_digit($i) || ( is_int($i) && $i > 0 ) ) { return TRUE; } 

вы можете упростить это, просто введя ввод в (string) чтобы один вызов ctype_digit проверил как string и int входы:

 if( ctype_digit( (string)$i ) ) { return TRUE; } 

Если вы используете «is_int», переменная должна быть целочисленной, поэтому она не может быть значением float. (не требуется раунд).

 if(isset($i) && is_int($i) && $i >= 0){ //0 is technically a postive integer I suppose return TRUE; //or FALSE I think in your case. } 

Я бы сделал что-то вроде этого:

 if ((int) $i > 0) { // this number is positive } 

Число получает приведение к положительному или отрицательному числу в зависимости от знака минус, который находится спереди. Затем сравнивает число типов с числом больше 0, чтобы определить, является ли число положительным.

Это мое решение, надеюсь, полезно:

 if (is_numeric($i) && (intval($i) == floatval($i)) && intval($i) > 0) echo "positive integer"; 

я проверяю, является ли строка числовой, вторая проверка, чтобы убедиться, что она целая и третья,