Подтвердить что ты не робот

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

Ответ 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: