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

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

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

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

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

Ответ 1

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

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

Ответ 2

Не самый быстрый метод, но 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 !!

Ответ 3

Не пытайтесь случайно превратить 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

Ответ 4

Обновление. С 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. Но это легко адресовать:)

Ответ 5

Другая опция

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

Ответ 6

Если строка содержит пробелы, то ответ @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 ';
}

Ответ 7

ctype_digit выполнит трюк:

ctype_digit($str)

  • $str должна быть строкой
  • дополнительные пробелы не разрешены
  • нет десятичных точек .

Ответ 8

Возможно, это также поможет в данной ситуации есть функция в 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, нет необходимости переписывать.

Ответ 9

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

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

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

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

Ответ 10

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

Ответ 11

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

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

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

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

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

Ответ 12

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

Assertion::integerish($var);

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

Ответ 13

is_int - это единственное, что он хотел сделать для этой работы.