Intereting Posts
Динамический класс PHP Как включить текстовый файл в PHP как PHP, без печати на страницу? Водяной знак в mPDF (PHP) работает неправильно on jQuery .html () update, другие функции перестают работать doctrine2: в двунаправленных отношениях «один ко многим», как сохранить с обратной стороны? Использование session_name () в PHP – невозможно получить данные TCPDF: когда-нибудь добавьте новую страницу, а затем переполнение содержимого следующей страницы Загрузка шаблона сопоставления файлов с использованием phpseclib читать и искать в pdf-файле Изображение невозможно отобразить, поскольку оно содержит ошибку в php gd Функция MYSQL DATE работает безумно медленнее в LEFT JOIN Показывать три изображения от каждого пользователя отключить смарт-уведомление неправильный порядок php mysql по метке времени Добавление и доступ к идентификаторам кнопок в таблице, сгенерированной PHP

Проверка того, содержит ли строка целое число

Вы знаете функцию, которая может проверить, содержит ли строка целое число?

Вот как я ожидаю, что это сработает:

holds_int("23") // should return true. holds_int("2.3") // should return false. holds_int("qwe") // should return false. 

 if((string)(int)$var == $var) { echo 'var is an integer or a string representation of an integer'; } 

Примеры результатов:

 var_dump( test(1) ); // TRUE var_dump( test('1') ); // TRUE var_dump( test('1.0') ); // TRUE var_dump( test('1.1') ); // false var_dump( test('0xFF') ); // false var_dump( test('0123') ); // TRUE var_dump( test('01090') ); // TRUE var_dump( test('-1000000') ); // TRUE var_dump( test('+1000000') ); // TRUE var_dump( test('2147483648') ); // false var_dump( test('-2147483649') ); // false 

См. Ниже ответ Гордона о том, как это будет выглядеть по-другому, если === использовались для сравнения вместо == .

Не самый быстрый метод, но filter_var() довольно точен:

 function test($s) { return filter_var($s, FILTER_VALIDATE_INT) !== false; } 

Вот результаты, основанные на ответе Джунга, отличия отмечены !! :

 var_dump(test(1) ); // true var_dump(test('1') ); // true var_dump(test('1.0') ); // false !! var_dump(test('1.1') ); // false var_dump(test('0xFF') ); // false var_dump(test('0123') ); // false !! var_dump(test('01090') ); // false !! var_dump(test('-1000000') ); // true var_dump(test('+1000000') ); // true var_dump(test('2147483648') ); // true !! on 64bit var_dump(test('-2147483649')); // true !! on 64bit 

Чтобы обеспечить восьмеричные целые числа:

 function test($s) { return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL) !== false; } 

Результаты:

 var_dump(test('0123') ); // true var_dump(test('01090')); // false !! 

Чтобы ввести шестнадцатеричную нотацию:

 function test($s) { return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX) !== false; } 

Результаты:

 var_dump(test('0xFF')); // true !! 

Не пытайтесь случайно превратить ответ Jhong в CW, так что для записи здесь результаты при тестировании с === вместо == .

 function test($var) { return ((string)(int)$var === $var); } var_dump( test(1) ); // returns false vs TRUE var_dump( test('1') ); // returns TRUE var_dump( test('1.0') ); // returns false vs TRUE var_dump( test('1.1') ); // returns false var_dump( test('0xFF') ); // returns false var_dump( test('0123') ); // returns false vs TRUE var_dump( test('-0123') ); // returns false vs TRUE var_dump( test('-1000000') ); // returns TRUE var_dump( test('+1000000') ); // returns false vs TRUE var_dump( test('2147483648') ); // returns false var_dump( test('-2147483649') ); // returns false 

Обновление Начиная с PHP 7.1 возникают проблемы с использованием is_int() с нечисловыми значениями, как описано в этом SO-ответе . В любом случае, это очень старый ответ, и я бы действительно рассматривал его как нечто вроде взлома на этом этапе, поэтому YMMV;)

Извините, если на этот вопрос был дан ответ, но это сработало для меня в прошлом:

Сначала проверьте, является ли строка is_numeric . если он добавляет 0 к значению, чтобы заставить PHP скрывать строку до соответствующего типа. Затем вы можете проверить, является ли это int с is_int . Быстрая и грязная, но она работает для меня …

 $values = array(1, '2', '2.5', 'foo', '0xFF', 0xCC, 0644, '0777'); foreach ($values as $value) { $result = is_numeric($value) && is_int(($value + 0)) ? 'true' : 'false'; echo $value . ': ' . $result . '<br />'; } 

Результаты:

 1: true 2: true 2.5: false foo: false 0xFF: true 204: true 420: true 0777: true 

Единственная проблема заключается в том, что он будет оценивать восьмеричные значения, заключенные в строку буквально, то есть: «0123» просто станет 123. Но это легко адресовать 🙂

Другой вариант

 function holds_int($str) { return preg_match("/^-?[0-9]+$/", $str); } 

Если строка содержит пробелы, то ответ @ Jack не даст точного результата. например

 $var = '19 '; if((string)(int)$var == $var) { echo 'var is an integer or a string representation of an integer'; } 

Вышеупомянутая строка не будет int в соответствии с вышеуказанной проверкой.

Поэтому вместо того, чтобы использовать это, попробуйте сделать следующее:

 if(ctype_digit(trim('19 '))){ echo 'it is digit '; }else{ echo 'it is not digit '; } 

ctype_digit сделает трюк:

ctype_digit($str)

  1. $str должна быть строкой
  2. дополнительные пробелы не допускаются
  3. нет десятичных точек .

Возможно, это также поможет в данной ситуации, есть функция в php, которая уже делает это, ее называемая «is_numeric ()», она вернет true или false.

  if(is_numeric($somestring) == True){ echo "this string contains a integar"; } 

ссылка: http://www.php.net/is_numeric

вы сказали, что «holdint (« 2 ») должно возвращать true, ну is_numeric (« 2 ») возвращает True и is_numeric (« a ») False, как и ожидалось, эта функция существует в php, нет необходимости переписывать.

comparison.php:

 <?php function is_numeric_int($s) { return (strval(intval($s)) === $s); } function print_ini($s) { echo "$s: " . ( is_numeric_int($s) ? 'true' : 'false' ) . "\n"; } print_ini('qwe'); print_ini('23'); print_ini('-23'); print_ini('23.0'); print_ini('-23.0'); ?> 

Тестовый забег:

 $ php comparison.php qwe: false 23: true -23: true 23.0: false -23.0: false 

Могут быть два случая –

  1. Вам нужно проверить точный строковый формат числа (большинство из них связано с этим)

  2. Вы хотите проверить, содержит ли строка определенный номер или нет

    preg_match('/'.$matching_number.'/',$container_string);

Мне понравилось предложение Нейсона, но заметил, что он будет ложным для '0123'. Я сейчас делаю это:

 (string)(int)$var === ltrim((string)$var, '0') 

(Это было бы опубликовано как комментарий @nyson, но у меня пока нет достаточных привилегий).

Отредактировано для добавления: если вы хотите, чтобы ноль был истинным, вам нужно сделать что-то вроде

 (int)$var === 0 || (string)(int)$var === ltrim((string)$var, '0') 

Если вы используете библиотеку Assert в проекте ( https://github.com/beberlei/assert ), вы можете легко сделать это в одной строке:

 Assertion::integerish($var); 

Примечание: это исключает в случае нарушения утверждение.

is_int – единственное, что он предназначен для выполнения этой работы.