如何检查字符串是否是int,但不是双精度等?

2022-08-30 06:30:00

PHP有一个函数,可以将字符串转换为整数。但是,我想事先检查字符串是否为整数,以便在错误时可以向用户提供有用的错误消息。PHP 有 ,但对于像 .intval()is_int()"2"

PHP 具有该函数,但如果数字为双精度值,则返回 true。我想要一些东西,对于双精度返回false,但对于int返回true。is_numeric()

例如:

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

答案 1

使用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

如果您的输入类型可能是 ,则与 is_int 结合使用。intctype_digit

如果您关心负数,则需要检查前面的 输入,如果是这样,请调用输入字符串的子字符串。像这样的东西会这样做:-ctype_digit

function my_is_int($input) {
  if ($input[0] == '-') {
    return ctype_digit(substr($input, 1));
  }
  return ctype_digit($input);
}

答案 2

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);
}

推荐