Получить положительное число php

Лучший способ проверить положительное целое число (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()

Читайте также:  Iframe html как создавать

Вариант 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) приходит, поскольку он проверяет, что ввод является целым числом.

Читайте также:  Connect to api with php

Ответ 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 в десятичной системе)
?>

Читайте также:  Url tracking code 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)

$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)

$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)
?>

Преобразование в целое

Для явного преобразования в 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 , так как это иногда может дать неожиданные результаты.

Источник

Оцените статью