- Лучший способ проверить положительное целое число (PHP)?
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- Ответ 14
- Ответ 15
- Ответ 16
- Ответ 17
- Ответ 18
- Ответ 19
- Ответ 20
- Ответ 21
- Целые числа
- Переполнение целых чисел
- Преобразование в целое
- Из булевого типа
- Из чисел с плавающей точкой
Лучший способ проверить положительное целое число (PHP)?
Мне нужно проверить, что входное значение формы является целым положительным (а не целое число), и я заметил еще один фрагмент кода, используя следующий код:
$i = $user_input_value; if (!is_numeric($i) || $i
Мне было интересно, есть ли преимущество в использовании трех проверок выше, вместо того, чтобы делать что-то вроде этого:
$i = $user_input_value; if (!is_int($i) && $i
ОТВЕТЫ
Ответ 1
разница между двумя фрагментами кода заключается в том, что is_numeric($i) также возвращает true, если $i является числовой строкой, но is_int($i) возвращает true, если $i является целым числом, а не if $i — целая строка . Вот почему вы должны использовать первый фрагмент кода, если вы также хотите вернуть true, если $i является строкой целочисленной строки (например, если $i == «19», а не $i == 19).
См. эти ссылки для получения дополнительной информации:
Ответ 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: простое тестирование литья/эквивалентности
Вариант 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
Будет ли это хорошо для вашего конкретного случая использования оставлено в качестве упражнения для читателя.
Ответ 5
Другой лучший способ проверить число Integer — использовать регулярное выражение. Вы можете использовать следующий код для проверки значения Integer. Он будет false для значений float.
Лучше, если вы также можете проверить, есть ли $i > 0.
Ответ 6
В дополнение ко всем остальным ответам: вы, вероятно, ищете ctype_digit . Он ищет строку, содержащую только цифры.
Ответ 7
Теперь, используя теорему deMorgan, т.е. (! A ||! C) = (A && C), тогда:
Теперь обратите внимание, что A && C = is_numeric ($ i) && & $i == round ($ i), но если $i == round ($ i) TRUE, то is_numeric ($ i) тоже TRUE, поэтому мы можем упростить A && C = C, поэтому
Поэтому вам просто нужно использовать:
$i = $user_input_value; if ($i == round($i) || $i
Ответ 8
Laravel 4.2 Правило проверки положительного числа
Он принимает только положительные числа, включая значения float.
public static $rules = array( 'field_name' => 'required|regex:/^\d*\.?\d*$/' );
Ответ 9
Вместо проверки int OR string с несколькими условиями, например:
if ( ctype_digit($i) || ( is_int($i) && $i > 0 ) )
вы можете упростить это, просто введя ввод в (string) , чтобы один вызов ctype_digit проверил как входы string , так и int :
Ответ 10
В первом примере используется round , чтобы убедиться, что вход представляет собой целое число, а не другое числовое значение (т.е. десятичное число).
is_int вернет false, если передал строку. См. Справочные примеры PHP для is_int
Ответ 11
Вам действительно не нужно использовать все три проверки, и если вы хотите получить положительное целое число, вы можете сделать противоположное тому, что находится в вашем коде:
Проверьте ответ Sören для получения дополнительной информации о разнице между is_int() и is_numeric()
Ответ 12
и если вы хотите ограничить длину:
preg_match('$>',$string)) //minimum of 1 max of 3
Так pisitive int с максимальной длиной 6:
if(preg_match('$>',$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";
P.S. Вам нужно будет включить php_gmp.dll в вашем .ini файле.
Ответ 16
Ответ 17
Если вы используете «is_int», переменная должна быть целочисленной, поэтому она не может быть значением float. (не требуется раунд).
Ответ 18
Ответ 19
Я бы сделал что-то вроде этого:
Число получает приведение к положительному или отрицательному числу в зависимости от знака минус, который находится спереди. Затем сравнивает число типов с числом больше 0, чтобы определить, является ли число положительным.
Ответ 20
Это мое решение, надеюсь, полезно:
i проверить, является ли строка числовой, второй проверить, чтобы убедиться, что она целая и третья, чтобы она была положительной
Ответ 21
просто делать:
if($a !== $a * -1) echo "positive number"; else echo "negative number";
Целые числа
Целые числа могут быть указаны в десятичной (основание 10), шестнадцатеричной (основание 16), восьмеричной (основание 8) или двоичной (основание 2) системе счисления, с необязательным предшествующим знаком (- или +).
Двоичная запись integer доступна начиная с PHP 5.4.0.
Для записи в восьмеричной системе счисления, необходимо поставить пред числом 0 (ноль). Для записи в шестнадцатеричной системе счисления, необходимо поставить перед числом 0x. Для записи в двоичной системе счисления, необходимо поставить перед числом 0b
Пример #1 Целые числа
$a = 1234 ; // десятичное число
$a = — 123 ; // отрицательное число
$a = 0123 ; // восьмеричное число (эквивалентно 83 в десятичной системе)
$a = 0x1A ; // шестнадцатеричное число (эквивалентно 26 в десятичной системе)
$a = 0b11111111 ; // двоичное число (эквивалентно 255 в десятичной системе)
?>?php
Формально, структуру целых чисел можно записать так:
десятичные : 16* | 0 шестнадцатеричные : 0[xX][0-9a-fA-F]+ восьмеричные : 05+ двоичные : 0b[01]+ целые : [+-]?десятичные | [+-]?шестнадцатеричные | [+-]?восьмеричные | [+-]?двоичные
Размер integer зависит от платформы, хотя, как правило, максимальное значение примерно равно 2 миллиардам (это 32-битное знаковое). 64-битные платформы обычно имеют максимальное значение около 9E18, кроме Windows, которая всегда 32-битная. PHP не поддерживает беззнаковые целые ( integer ). С версии PHP 4.4.0 и PHP 5.0.5 размер integer может быть определен с помощью константы PHP_INT_SIZE , а его максимальное значение — с помощью константы PHP_INT_MAX .
Если в восьмеричном integer будет обнаружена неверная цифра (например, 8 или 9), оставшаяся часть числа будет проигнорирована.
Пример #2 Странности с восьмеричными числами
Переполнение целых чисел
Если PHP обнаружил, что число превышает размер типа integer , он будет интерпретировать его в качестве float . Аналогично, если результат операции лежит за границами типа integer , он будет преобразован в float .
Пример #3 Переполнение целых на 32-битных системах
$large_number = 2147483647 ;
var_dump ( $large_number ); // int(2147483647)
?php
$large_number = 2147483648 ;
var_dump ( $large_number ); // float(2147483648)
$million = 1000000 ;
$large_number = 50000 * $million ;
var_dump ( $large_number ); // float(50000000000)
?>
Пример #4 Переполнение целых на 64-битных системах
$large_number = 9223372036854775807 ;
var_dump ( $large_number ); // int(9223372036854775807)
?php
$large_number = 9223372036854775808 ;
var_dump ( $large_number ); // float(9.2233720368548E+18)
$million = 1000000 ;
$large_number = 50000000000000 * $million ;
var_dump ( $large_number ); // float(5.0E+19)
?>
В PHP не существует оператора деления целых чисел. Результатом 1/2 будет float 0.5. Если привести значение к integer , оно будет округлено вниз. Для большего контроля над округлением используйте функцию round() .
var_dump ( 25 / 7 ); // float(3.5714285714286)
var_dump ((int) ( 25 / 7 )); // int(3)
var_dump ( round ( 25 / 7 )); // float(4)
?>?php
Преобразование в целое
Для явного преобразования в integer , используйте приведение (int) или (integer). Однако, в большинстве случаев, в приведении типа нет необходимости, так как значение будет автоматически преобразовано, если оператор, функция или управляющая структура требует аргумент типа integer . Значение также может быть преобразовано в integer с помощью функции intval() .
Если resource преобразуется в integer , то результатом будет уникальный номер ресурса, привязанный к resource во время исполнения PHP программы.
Из булевого типа
FALSE преобразуется в 0 (ноль), а TRUE — в 1 (единицу).
Из чисел с плавающей точкой
При преобразовании из float в integer , число будет округлено в сторону нуля.
Если число с плавающей точкой превышает размеры integer (обычно +/- 2.15e+9 = 2^31 на 32-битных системах и +/- 9.22e+18 = 2^63 на 64-битных системах, кроме Windows), результат будет неопределенным, так как float не имеет достаточной точности, чтобы вернуть верный результат. В этом случае не будет выведено ни предупреждения, ни даже замечания!
Никогда не приводите неизвестную дробь к integer , так как это иногда может дать неожиданные результаты.