Проверка, содержит ли строка целое число - PullRequest
35 голосов
/ 31 июля 2010

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

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

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

Ответы [ 14 ]

64 голосов
/ 31 июля 2010
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

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

12 голосов
/ 18 апреля 2013

Не самый быстрый метод, но 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 !!
11 голосов
/ 31 июля 2010

Не хочу случайно превращать ответ Чонга в 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
8 голосов
/ 31 июля 2010

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

4 голосов
/ 02 февраля 2014

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

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

function holds_int($str)
   {
   return preg_match("/^-?[0-9]+$/", $str);
   }
3 голосов
/ 05 февраля 2016

ctype_digit добьется цели:

ctype_digit($str)

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

Может быть, это также поможет в данной ситуации в 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, переписывать не нужно. 1007 *

1 голос
/ 05 сентября 2018

Я использую это с давних времен.Если вы хотите обнаружить любую возможную int-значимую вещь, включая 1.0 "1.0" 1e3 "007", тогда вам лучше позволить is_numeric сделать свою работу , чтобы обнаружить любой возможный объект PHP, представляющий число, и только тогда проверитьэто число является целым числом.

function isIntValued($var) {
    if(is_numeric($var)) { // At least it's number, can be converted to float
        $var=(float)$var; // Now it is a float
        return ((float)(int)$var)===$var;
    }
    return FALSE;
}

или короче

function isIntValued($var) {
    return (!is_numeric($var)?FALSE:((float)(int)(float)$var)===(float)$var);
}

Обратите внимание, что в то время как PHP is_int() проверяет, является ли переменная тип целым числомнаоборот, другая стандартная функция PHP is_numeric() очень точно определяет, является ли содержимое переменной (то есть строковые символы) может представлять число.

1 голос
/ 08 февраля 2015

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

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

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

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

(int)$var === 0 || (string)(int)$var === ltrim((string)$var, '0')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...