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的关系?
- 八进制表示法是 considered numeric。
- 十六进制表示法stopped being considered in PHP/7.0。
- 二进制表示法has never been。
- 整数溢出not a direct concern但会导致精度损失。
该手册没有明确说明用例是什么,但总的来说它更像是一个辅助工具(以确保您可以将字符串化数据提供给需要数值的函数)而不是一个适当的表单验证器。如果在不期望 88205052E00
的环境中收集输入,那么期望(并生成)本地化数据并实施 locale-aware solution.
可能是个好主意
我注意到 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的关系?
- 八进制表示法是 considered numeric。
- 十六进制表示法stopped being considered in PHP/7.0。
- 二进制表示法has never been。
- 整数溢出not a direct concern但会导致精度损失。
该手册没有明确说明用例是什么,但总的来说它更像是一个辅助工具(以确保您可以将字符串化数据提供给需要数值的函数)而不是一个适当的表单验证器。如果在不期望 88205052E00
的环境中收集输入,那么期望(并生成)本地化数据并实施 locale-aware solution.