正常情况下,我们判断一个变量是否是数字类型会使用 is_numeric
这个函数,因为is_int
和 is_float
都是针对指定类型的判断。
但是,我们运行以下代码的时候,以为是false,但是发现打印出来的结果是 true
var_dump(is_numeric('123E456')); // true
为什么会这样呢?
首先,我们需要先知道 123E456 到底是个什么东西
1e-10表示1*10^-10 这是一种指数形式的计数方法。由数符、十进制数、阶码标志'E'或'e'以及阶符和阶码组成。 如:
-1e-3的数符为'-',十进制数为1,阶符为'-',阶码为3
1e-10的数符被省略了(默认为'+'),十进制数为1,阶符为'-',阶码为10
注:阶码标志'E'或'e'之前必须有数字。
了解了 123E456 的组成,我们来看看is_numeric
函数到底是怎么判断的呢
is_numeric
会检测是否为数字字符串,可为负数和小数,科学计数法如 110e2 会认为是数字。
所以我们判断123E456时会与预期不符
ctype_digit
检测字符串中的字符是否都是数字,负数和小数会检测不通过。
var_dump(ctype_digit('123E456')); // false