Знаете ли вы о функции, которая может проверить, содержит ли строка целое число?
Вот как я ожидаю, что это сработает:
holds_int("23") // should return true.
holds_int("2.3") // should return false.
holds_int("qwe") // should return false.
Знаете ли вы о функции, которая может проверить, содержит ли строка целое число?
Вот как я ожидаю, что это сработает:
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;
}
Вот результаты, основанные на Jhong answer, отличия, отмеченные !!
:
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, нет необходимости переписывать.
Могут быть два случая -
Вам нужно проверить строчный формат номера (большинство из них относится к этому)
Вы хотите проверить, содержит ли строка определенный номер или нет.
preg_match('/'.$matching_number.'/',$container_string);
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
Мне понравилось предложение nyson, но заметил, что он будет ложным для '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
- это единственное, что он хотел сделать для этой работы.