【问题标题】:PHP "is_numeric" accepts "E" as a numberPHP "is_numeric" 接受 "E" 作为数字
【发布时间】:2019-05-20 07:44:30
【问题描述】:

我注意到 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 用于科学计数法,所以是的,它被认为是有效数字。
  • 您可能想查看一个检查非0-9 字符的正则表达式。并在需要时处理小数 .
  • 只要涉及 PHP 就是一个数字 (demo)。
  • 您期望负数还是小数?

标签: php string numbers isnumeric


【解决方案1】:

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

您更有可能使用 ctype_digit 检查提供的字符串文本中的所有字符是否都是数字。

where as is_numeric — 查找变量是数字还是数字字符串

<?php

$s = "88205052E00";

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

返回编号。

【讨论】:

  • 如果你想让3948394873281738173172493274871218201832081239183-1返回真假,那很好。
  • 我知道我以前没有使用它是有原因的。正在调整
  • 因为我只需要检查数字(我不需要`-`或`.`),这个答案解决了我的问题。感谢您的帮助。
【解决方案2】:

只需使用正则表达式:

<?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

【讨论】:

  • 使用trim() 表示\t\t12345\n\t\t\n(两边有几个空白字符)是数字。
  • 是的,我假设在原始变量上使用了 trim。可能最好不要假设。
【解决方案3】:

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

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

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

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

【讨论】:

  • 应该是===,而不是!==
【解决方案4】:

假设你想确保字符串是一个有效的整数,你可以使用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

【讨论】:

  • 如果你只是想检查变量是否为整数,你不能用is_int吗?
  • 没有。 is_int('1234') 返回 false。
  • 啊,我的错。我可以发誓有一个内置的。
  • 我猜这就是 filter_var 的用途。
  • 所有功能(包括上述)都有陷阱。 ctype_digit('239284923942734924729749327') 是真的,但显然它对于整数来说太大了。
【解决方案5】:

我们来看看the definition:

查找给定变量是否为数字。数字字符串包括 可选符号、任意位数、可选小数部分和 可选指数部分。因此+0123.45e6 是一个有效的数值。 十六进制(例如0xf4c3b00c)和二进制(例如0b10100111001)表示法 不允许。

floating point literals 的关系很明确,但它与integer literals 有何关系?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2022-01-09
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多