Вы знаете функцию, которая может проверить, содержит ли строка целое число?
Вот как я ожидаю, что это сработает:
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)
$str
должна быть строкой .
Возможно, это также поможет в данной ситуации, есть функция в 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
Могут быть два случая –
Вам нужно проверить точный строковый формат числа (большинство из них связано с этим)
Вы хотите проверить, содержит ли строка определенный номер или нет
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
– единственное, что он предназначен для выполнения этой работы.