В PHP есть intval()
функция, которая преобразует строку в целое число. Однако я хочу заранее проверить, что строка является целым числом, чтобы я мог дать пользователю полезное сообщение об ошибке, если оно неверно. PHP имеет is_int()
, но это возвращает ложь для строки, как "2"
.
PHP имеет is_numeric()
функцию, но она вернет true, если число является двойным. Я хочу что-то, что будет возвращать false для двойного, но true для int.
например:
my_is_int("2") == TRUE
my_is_int("2.1") == FALSE
Ответы:
Как насчет использования
ctype_digit
?Из руководства:
Приведенный выше пример выведет:
Это будет работать только если ваш ввод всегда является строкой:
Если ваш ввод может быть типа
int
, то объединитеctype_digit
сis_int
.Если вы заботитесь о отрицательных числах, то вам необходимо проверить вход для предшествующего
-
, и если да, то вызовctype_digit
наsubstr
входной строку. Что-то вроде этого сделало бы это:источник
ctype_digit(abs($str))
вместо justctype_digit
.abs('definitelynotanint') === 0
. кроме того,ctype_digit
принимает только строкиfilter_var
следует сделать это:но
Если вы просто хотите, чтобы логические значения были возвращаемыми значениями, оберните их в функцию, например
источник
==
возможно?if
3v4l.org/IAvCF+1 к ответу Доминика (используя
ctype_digit
). Другой способ, которым вы могли бы сделать это, с помощью приведения типа:источник
is_int($inty + 0) && is_numeric($inty)
(я знаю, что это ленивое решение, но работает для большинства намерений и целей ...Приведите его к int. если он все еще имеет то же значение, то его int;
источник
return $var == (int) $var;
Источник .
источник
elseif
может быть простоif
потому, что вы уже вернулись в заявлении над ним.$data
это объект, он вернетсяnull
. Лучше иметьreturn false;
в конце.Нужна была крепкая в
is_int
последнее время. Я нашел intval () слишком непредсказуемым:Этот фрагмент встречался в комментариях к документации PHP, и после тестирования он охватывает практически все, что вы на него бросаете:
Но осторожно:
источник
Один действительно чистый способ, который мне нравится использовать, - это тот. Вы разыгрываете его дважды, сначала в
int
, во вторуюstring
, затем вы строго сравниваете===
. Смотрите пример ниже:Теперь о вашей функции my_is_int вы можете сделать что-то вроде этого:
источник
источник
'/^[-+]?[0-9]+$/'
Я использую это:
источник
Вы можете просто проверить число, если оно проверено, то если приведение удвоено или нет:
Просто для положительных чисел:
Проверяем это:
Вывод:
источник
Попробуй это:
Также работает, если ваша строка $ имеет десятичные разряды
источник
Это позаботится и об отрицательном числе
источник
источник
Я придумал способ, который нигде не мог найти, поэтому я помещаю это здесь:
Без дальнейших церемоний это так:
ctype_digit((string) abs($input))
Пример:
Результаты: (как и ожидалось, я полагаю)
источник
Возможно, не самый эффективный способ сделать это. Но вы можете написать это в одну строку.
Как и ожидалось:
Попался:
источник
Несколько лет спустя, но, основываясь на ответах, приведенных здесь, я нашел решение, которое было бы несколько более точным (в частности, по логическим значениям) и более эффективным (я думаю), чем большинство других ответов:
Работая как ожидалось для этих:
За исключением, может быть, для этих 2:
источник
Как насчет:
Эта функция должна возвращать true только для любого строкового числа, которое может быть приведено к int с потерей
(int)
илиintval()
без потери чего-либо математического значения (например, ненулевых значений после десятичной точки или чисел за пределами целочисленного диапазона PHP), принимая при этом вещи, которые не являются математически значимыми (например, пробел; начальные нули; или, после десятичной точки, исключительно нули).Он вернет ложь для,
'10.'
но не для'10.0'
. Если вы хотите'10.'
быть правдой, вы можете изменить+
после0
в регулярном выражении после*
.источник
Вот некоторый код, который я использовал, который, кажется, работает хорошо и не имеет проблем, которые делают многие другие.
Он не проверяет порядок и т. Д., Поэтому он предназначен не для отрицательных целых чисел, а с некоторым дополнительным кодом, который также может быть выполнен с использованием некоторых других идей, приведенных выше. Он также может быть адаптирован для работы с двоичными
array('0', '1')
или шестнадцатеричными числами и т. Д.источник
Посмотри это. Преобразует $ val в целое число, а затем проверяет, является ли исходный $ val, преобразованный в строку, IDENTICAL (===) - просто == не будет работать должным образом - в целое число val, преобразованное в строку.
Если вы не проверяете строковые значения, они могут работать не так, как вы ожидаете:
Вывод:
Причина в том, что даже если вы используете шестнадцатеричный (0x101010), восьмеричный (01) или целое число, хранящееся как float (1.0, 0.0), внутренне все они хранятся как float. Однако если вы используете функцию для проверки на наличие int, хранящегося в виде строки, она будет работать.
источник
источник
Вы можете использовать следующее условие. Обратите внимание, что вы не должны использовать! ==
источник
Работает отлично! Надеюсь, это будет полезно для вас =)
источник
Если вы хотите действительно знать, является ли строка правильным представлением истинного целочисленного типа PHP ...
Однако это невозможно запустить, так как набор слишком велик (в этом случае он не помещается в память, если вы зациклите его, это займет слишком много циклов ЦП).
Возможно, вы можете выполнить бинарный поиск со сравнением строк, однако есть и лучшие способы.
Самое простое существо:
Есть несколько других необычных способов приблизиться к этому, таких как:
Вы также можете выполнять сравнение строк, но вам все равно нужно будет делать такие вещи, как ctype_digit, проверять разумность длины (не тратьте ЦП, прежде чем делать такие вещи, как ctype_digit) и иметь некоторую неловкую обработку для отрицательных чисел.
Обратите внимание , что filter_var не правильно утверждать , что строка действительно представление РНР целое. Это позволит ведущий + и окружающие пробелы.
Внутренне PHP использует функцию "_zend_handle_numeric_str" для строгого сравнения, но он нигде не раскрывает это напрямую, отсюда и хитрость с использованием ключей массива (которая использует ее для преобразования любой строки, представляющей целое число PHP, в целое число PHP).
Если вы хотите, чтобы двоичное безопасное преобразование в и из PHP это подход.
Не каждый может захотеть этого, и это может быть случай обработки пользовательского ввода. filter_var не так уж плох для этого и в большинстве случаев будет достаточно безопасным для новичков в PHP.
Проверка длины, ctype_digit и затем проверка преобразованного значения, что оно находится в диапазоне, также достаточно надежны для ввода пользователем. Более сложные схемы могут потребовать обрезки или регулярного выражения.
Проблема с большим количеством ответов здесь в этом отношении состоит в том, что, хотя вопрос является расплывчатым, ответы не должны быть. Если вы собираетесь предложить решение, вы должны быть в состоянии объяснить, что именно оно будет и не ожидать. Без этого нельзя сказать, соответствует ли ответ на вопрос или является безопасным. Руководство по PHP не всегда помогает, потому что оно не объясняет все предостережения для каждого из соответствующих методов, которые оно предоставляет. Такие вещи, как ctype_digit и is_int очень надежны и их легко предопределить, но особенности is_numeric, filter_var и juggling (+ $ var) или приведение типов (intval / floatval) плохо документированы.
Это PHP выдумка для вас. У него есть бесчисленное множество схем для интерпретации строк как целых чисел с несоответствиями. Самый строгий метод проверки целочисленной строки не предоставляется непосредственно пользователю.
источник
Если вы обрабатываете числовые идентификаторы из mysql и пытаетесь навязать валидацию для него, чтобы оно было действительным ненулевым int или
int
но в строковом формате (так как mysql всегда возвращает все в строковом формате ), а не такNULL
. Вы можете использовать следующее. Это наиболее надежный способ подтверждения ошибок / предупреждений / уведомлений,int/string-ints
который я обнаружил.источник
Вот простое решение, которое использует is_numeric , floatval и intval :
Полученные результаты:
Обратите внимание, что значения, превышающие PHP_INT_MAX, могут возвращать false.
источник
Можно использовать is_numeric (), а затем проверить наличие "." в строке (не особо чувствительный к культуре, хотя).
В качестве альтернативы используйте is_numeric (), затем приведите к двойному и посмотрите, будет ли $ var == floor ($ var) (должно возвращать true, если это целое число).
источник