Как проверить, что строка является целым числом, а не двойным и т. Д.? - PullRequest
135 голосов
/ 06 января 2010

PHP имеет функцию intval(), которая преобразует строку в целое число. Однако я хочу заранее проверить, что строка является целым числом, чтобы я мог дать пользователю полезное сообщение об ошибке, если оно неверно. PHP имеет is_int(), но возвращает строку для строки типа "2".

PHP имеет функцию is_numeric(), но она вернет true, если число является двойным. Я хочу что-то, что будет возвращать false для двойного, но true для целого.

например:.

my_is_int("2") == TRUE
my_is_int("2.1") == FALSE

Ответы [ 24 ]

162 голосов
/ 06 января 2010

Как насчет использования ctype_digit?

Из руководства:

<?php
$strings = array('1820.20', '10002', 'wsl!12');
foreach ($strings as $testcase) {
    if (ctype_digit($testcase)) {
        echo "The string $testcase consists of all digits.\n";
    } else {
        echo "The string $testcase does not consist of all digits.\n";
    }
}
?>

Приведенный выше пример выдаст:

The string 1820.20 does not consist of all digits.
The string 10002 consists of all digits.
The string wsl!12 does not consist of all digits.

Это будет работать, только если вы всегда вводите строку:

$numeric_string = '42';
$integer        = 42;

ctype_digit($numeric_string);  // true
ctype_digit($integer);         // false

Если ваш ввод может быть типа int, то объедините ctype_digit с is_int.

Если вам небезразличны отрицательные числа, вам нужно проверить ввод для предшествующего -, и если это так, вызвать ctype_digit для substr входной строки. Что-то вроде этого сделало бы это:

function my_is_int($input) {
  if ($input[0] == '-') {
    return ctype_digit(substr($input, 1));
  }
  return ctype_digit($input);
}
79 голосов
/ 06 января 2010

filter_var должен сделать это:

var_dump(filter_var('2', FILTER_VALIDATE_INT));   // 2
var_dump(filter_var('2.0', FILTER_VALIDATE_INT)); // false
var_dump(filter_var('2.1', FILTER_VALIDATE_INT)); // false

но

var_dump(filter_var(2, FILTER_VALIDATE_INT));     // 2
var_dump(filter_var(2.0, FILTER_VALIDATE_INT));   // 2
var_dump(filter_var(2.1, FILTER_VALIDATE_INT));   // false

Если вы просто хотите, чтобы логические значения были возвращаемыми значениями, оберните их в функцию, например,

function validatesAsInt($number)
{
    $number = filter_var($number, FILTER_VALIDATE_INT);
    return ($number !== FALSE);
}
17 голосов
/ 06 января 2010

+ 1 к ответу Доминика (используя ctype_digit). Другой способ сделать это можно с помощью приведения типа:

$inty = "2";
$inty2 = " 2";
$floaty = "2.1";
$floaty2 = "2.0";

is_int($inty + 0); // true
is_int($floaty + 0); // false
is_int($floaty2 + 0); // false

// here's difference between this and the ctype functions.
is_int($inty2 + 0);  // true
ctype_digit($inty2); // false
12 голосов
/ 06 января 2010

Приведите его к int. если он все еще имеет то же значение, то его int;

function my_is_int($var) {
  $tmp = (int) $var;
  if($tmp == $var)
       return true;
  else
       return false;
}
7 голосов
/ 06 января 2010
/**
 * Check if a number is a counting number by checking if it
 * is an integer primitive type, or if the string represents
 * an integer as a string
 */
function is_int_val($data) {
    if (is_int($data) === true) return true;
    if (is_string($data) === true && is_numeric($data) === true) {
        return (strpos($data, '.') === false);
    }
}

Источник .

6 голосов
/ 11 марта 2013

Недавно потребовался надежный is_int. Я нашел intval () слишком непредсказуемым:

intval(array('foo', 'bar')) //returns 1 ?!?
intval("2dog") //returns 2 even though the value is definitely not an integer
intval("dog2") //also returns 2


Этот фрагмент встречался в комментариях к документации по PHP, и после его тестирования он охватывает почти все, что вы ему бросаете:

function my_is_int($s) {
    return (is_numeric($s) ? intval($s) == $s : false);
}


my_is_int(2); //true
my_is_int("2"); //true
my_is_int(2.1); //false
my_is_int("2.1"); //false
my_is_int("dog"); //false
my_is_int("2dog"); //false
my_is_int("dog2"); //false
my_is_int(array('foo', 'bar')); //false
my_is_int(array(1)); //false


Но осторожно:

my_is_int(2.0); //true
my_is_int("2.0"); //true
4 голосов
/ 16 мая 2012
function my_is_int($var) {
    return preg_match('/^\d+$/', $var);
}
3 голосов
/ 14 августа 2018

Один действительно чистый способ, который мне нравится использовать, - это тот. Вы разыгрываете его дважды, сначала в int, во-вторых в string, затем строго сравниваете ===. Смотрите пример ниже:

$value === (string)(int)$value;

Теперь, о вашей функции my_is_int, вы можете сделать что-то вроде этого:

function my_is_int($value){ return $value === (string)(int)$value; }
my_is_int('2');  // true
my_is_int('2.1') // false
3 голосов
/ 20 января 2016

Вы можете просто проверить число, если это так, то проверить, что касту дают двойное число или нет:

((is_numeric($var) && !is_double(1*$var)));

Только для положительных чисел:

(is_numeric($var) && !is_double(1*$var)) && ($var >= 0)

Проверка:

$numbersToCheck = array("a", "-1", "1", "1.0", "1.2");

foreach ($numbersToCheck as $var) {
    echo $var . " is integer? ";var_dump((is_numeric($var) && !is_double(1*$var)));

    echo $var . " is a positive integer? ";var_dump((is_numeric($var) && !is_double(1*$var)) && ($var >= 0));
}

Выход:

a is integer? bool(false)
a is a positive integer? bool(false)
-1 is integer? bool(true)
-1 is a positive integer? bool(false)
1 is integer? bool(true)
1 is a positive integer? bool(true)
1.0 is integer? bool(false)
1.0 is a positive integer? bool(false)
1.2 is integer? bool(false)
1.2 is a positive integer? bool(false)
3 голосов
/ 19 августа 2013

Я использую это:

function isInt($val){

    return (filter_var($val, FILTER_VALIDATE_INT) !== false && strpos($val, '-') === false);

}

var_dump (isInt("1"));
...