Мне нужно проверить, что входное значение формы является положительным целым числом (а не просто целым числом), и я заметил еще один фрагмент кода, используя следующий код:
$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 ) );
Лучший способ проверить положительные целые числа, когда переменная может быть 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: простое испытание литья / эквивалентности
Вариант 2: использование is_int () и ctype_digit ()
Вариант 3: регулярные выражения
Возможно, неудивительно, что вариант 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";
я проверяю, является ли строка числовой, вторая проверка, чтобы убедиться, что она целая и третья,