Лучший способ проверить положительное целое число (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;
}
Ответы
Ответ 1
разница между двумя фрагментами кода заключается в том, что is_numeric($i)
также возвращает true, если $i является числовой строкой, но is_int($i)
возвращает true, если $i является целым числом, а не if $i - целая строка . Вот почему вы должны использовать первый фрагмент кода, если вы также хотите вернуть true, если $i является строкой целочисленной строки (например, если $i == "19", а не $i == 19).
См. эти ссылки для получения дополнительной информации:
php is_numeric function
функция php is_int
Ответ 2
Не уверен, почему нет предложения использовать 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 )
);
Узнайте больше о фильтрах.
Ответ 3
Лучший способ проверки положительных целых чисел, когда переменная может быть 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" ).
Ответ 4
Он определенно движется к земле микро-оптимизации, но эй: код, над которым я работаю, перебирает миллионы предметов каждый день и в пятницу. Поэтому я немного экспериментировал...
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 с
- String: 0.4s
Вариант 2: использование is_int() и ctype_digit()
- Целое число: 0,9 с
- Строка: 1.45s
Вариант 3: регулярные выражения
- Целое число: 1.83s
- String: 1.60s
Возможно, неудивительно, что вариант 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
Будет ли это хорошо для вашего конкретного случая использования оставлено в качестве упражнения для читателя...
Ответ 5
Другой лучший способ проверить число Integer - использовать регулярное выражение. Вы можете использовать следующий код для проверки значения Integer. Он будет false для значений float.
if(preg_match('/^\d+$/',$i)) {
// valid input.
} else {
// invalid input.
}
Лучше, если вы также можете проверить, есть ли $i > 0.
Ответ 6
В дополнение ко всем остальным ответам: вы, вероятно, ищете ctype_digit
. Он ищет строку, содержащую только цифры.
Ответ 7
Определение:
!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) тоже TRUE, поэтому мы можем упростить 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;
}
Ответ 8
Laravel 4.2 Правило проверки положительного числа
Он принимает только положительные числа, включая значения float.
public static $rules = array(
'field_name' => 'required|regex:/^\d*\.?\d*$/'
);
например: 20,2.6,06
Ответ 9
Вместо проверки int
OR string
с несколькими условиями, например:
if ( ctype_digit($i) || ( is_int($i) && $i > 0 ) )
{
return TRUE;
}
вы можете упростить это, просто введя ввод в (string)
, чтобы один вызов ctype_digit
проверил как входы string
, так и int
:
if( ctype_digit( (string)$i ) )
{
return TRUE;
}
Ответ 10
В первом примере используется round
, чтобы убедиться, что вход представляет собой целое число, а не другое числовое значение (т.е. десятичное число).
is_int вернет false, если передал строку. См. Справочные примеры PHP для is_int
Ответ 11
Вам действительно не нужно использовать все три проверки, и если вы хотите получить положительное целое число, вы можете сделать противоположное тому, что находится в вашем коде:
if(is_numeric($i) && $i >= 0) { return true; }
Проверьте ответ Sören для получения дополнительной информации о разнице между is_int()
и is_numeric()
Ответ 12
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)
Ответ 13
Чтобы проверить положительное целочисленное использование:
$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
Ответ 14
Все эти ответы не учитывают тот факт, что запросчик может проверить ввод формы.
Ошибка is_int() не будет выполнена, потому что ввод формы является строкой.
is_numeric() будет истинным также для чисел с плавающей точкой.
Вот почему $i == round ($ i) приходит, поскольку он проверяет, что ввод является целым числом.
Ответ 15
Хорошо, я знаю, что эта ветка действительно старая, но я разделяю мнение @Jeffrey Vdovjak: поскольку я смог ее найти, она все равно может помочь кому-то другому.
php gmp_sign() может быть другим простым способом проверки. Он работает для целых и числовых строк и возвращает 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
P.S. Вам нужно будет включить php_gmp.dll в вашем .ini файле.
Ответ 16
if(preg_match('/^[1-9]\d*$/',$i)) {
//Positive and > 0
}
Ответ 17
Если вы используете "is_int", переменная должна быть целочисленной, поэтому она не может быть значением float. (не требуется раунд).
Ответ 18
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.
}
Ответ 19
Я бы сделал что-то вроде этого:
if ((int) $i > 0) {
// this number is positive
}
Число получает приведение к положительному или отрицательному числу в зависимости от знака минус, который находится спереди. Затем сравнивает число типов с числом больше 0, чтобы определить, является ли число положительным.
Ответ 20
Это мое решение, надеюсь, полезно:
if (is_numeric($i) && (intval($i) == floatval($i)) && intval($i) > 0)
echo "positive integer";
i проверить, является ли строка числовой, второй проверить, чтобы убедиться, что она целая и третья, чтобы она была положительной
Ответ 21
просто делать:
if($a !== $a * -1) echo "positive number";
else echo "negative number";
: Face_palm: