PHP имеет intval()
функция, которая преобразует строку в целое число. Однако я хочу проверить, что строка является целым числом заранее, так, чтобы я мог дать полезное сообщение об ошибке пользователю, если это неправильно. PHP имеет is_int()
, но это возвращает false для строки как "2"
.
PHP имеет is_numeric()
функция, но это возвратит true, если число будет двойным. Я хочу что-то, что возвратит false для двойного, но верный для интервала.
например:
my_is_int("2") == TRUE
my_is_int("2.1") == FALSE
Как насчет использования 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
на подложке
входной строки. Что-то подобное могло бы сделать это:
function my_is_int($input) {
if ($input[0] == '-') {
return ctype_digit(substr($input, 1));
}
return ctype_digit($input);
}
/**
* 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);
}
}
]
[][]Source[].[
]]Можно использовать is_numeric(), затем проверить наличие "..." в строке (не особенно культурно-чувствительной, однако).[
] []Альтернативное использование is_numeric(), а затем преобразовать в double и посмотреть, $var == floor($var) (должен ли возвращать true, если это целое число).[
].+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
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);
}
Передайте это в интенсивную службу. если он все еще имеет то же значение его int;
function my_is_int($var) {
$tmp = (int) $var;
if($tmp == $var)
return true;
else
return false;
}