PHP "is_numeric" 接受 "E" 作为数字

PHP "is_numeric" accepts "E" as a number

我注意到 PHP is_numeric() 接受 "E" 作为数字。 我有一个字符串:“88205052E00”,我希望结果为:NOT numeric.

这是我测试过的代码。

<?php

$notnumber = '88205052E00';

if(is_numeric($notnumber)) {
    echo $notnumber . ' is a number';
} else {
    echo $notnumber . ' is NOT a number';
}

?>

上面的代码给出了结果:

88205052E00 is a number

我怎样才能得到结果:88205052E00 不是数字?

E 是有效的,因为浮点数 (http://php.net/manual/en/language.types.float.php)。

如果您出于任何原因不想允许 E,您可以独立检查它:

if (strpos(strtolower($notnumber), 'e') === false && is_numeric($notnumber))

这确保没有 E 并且它也是数字。

只需使用正则表达式即可:

<?php
if (preg_match("/^\-?[0-9]*\.?[0-9]+\z/", $notnumber)) {
    echo "$notnumber is numeric\n";
} else {
    echo "$notnumber is not numeric\n";
}

结果:

   1234 is numeric
1234E56 is not numeric
  -1234 is numeric
  .1234 is numeric
 -.1234 is numeric
 -12.34 is numeric

假设你想确保字符串是一个有效的整数,你可以使用 filter_var:

$tests = ['1', '1.1', '1e0', '0x1'];
foreach($tests as $str) {
    $int = filter_var($str, FILTER_VALIDATE_INT);
    if ($int === false) {
        echo $str . ' is not an integer' . PHP_EOL;
    } else {
        echo $str . ' is an integer' . PHP_EOL;
    }
}

结果:

1 is an integer
1.1 is not an integer
1e0 is not an integer
0x1 is not an integer

我会保留答案,以防它有帮助,但正如所指出的那样,ctype_digit 存在缺点,因为它不喜欢 -.

那么您更有可能想要使用 ctype_digit,它会检查提供的字符串文本中的所有字符是否都是数字。

Where as is_numeric — 判断变量是数字还是数字字符串

<?php

$s = "88205052E00";

if(ctype_digit($s)){
    echo "Yes";
} else {
    echo "No";
}

returns没有

让我们检查一下 the definition:

Finds whether the given variable is numeric. Numeric strings consist of optional sign, any number of digits, optional decimal part and optional exponential part. Thus +0123.45e6 is a valid numeric value. Hexadecimal (e.g. 0xf4c3b00c) and binary (e.g. 0b10100111001) notation is not allowed.

floating point literals is clear but, how does it all relate to integer literals的关系?

该手册没有明确说明用例是什么,但总的来说它更像是一个辅助工具(以确保您可以将字符串化数据提供给需要数值的函数)而不是一个适当的表单验证器。如果在不期望 88205052E00 的环境中收集输入,那么期望(并生成)本地化数据并实施 locale-aware solution.

可能是个好主意