is_numeric,intval,ctype__digit ..你能依靠它们吗?
还是我必须使用正则表达式?
function isNum($str) {你觉得怎么样?我是傻瓜吗?
return (preg_match("/^[0-9]+$/", $str));
}
答案 0 :(得分:11)
is_numeric,intval和ctype_digit都做了很多不同的事情。
is_numeric将告诉您变量的内容是否为数字(如果它是浮点或整数值,则为true)。
intval尝试将一串数字转换为整数值
ctype_digit会告诉您字符串是否只包含数字字符(将执行与isNum函数相同的检查)。
最好的方法可能是检查is_numeric是否为真,然后使用settype($ myvalue,'integer')或intval($ myvalue)行的内容;
答案 1 :(得分:10)
ctype_digit
和is_numerict
之间的一个重要区别是负值和浮点数。
is_numeric(-10)
将返回true
'ctype_digit(-10)'将为false
ctype_digit(12.50)
也将返回false
is_numeric(12.50)
将为true
所以它们都很方便,取决于域逻辑的上下文。
答案 2 :(得分:4)
您命名了两种功能:
验证程序检查给定值是否具有给定的特征并返回 true 或 false 。
is_numeric
,ctype_*
functions和您的isNum
函数正在验证函数,因为它们只是告诉您值是否有效。
过滤器更改给定值,使新值具有给定的特征,因此有效。
intval
和filter_*
functions是过滤函数,因为它们始终会返回通过验证程序的有效值。
答案 3 :(得分:1)
您还可以使用新的filter functions。
if (!$var = filter_var($var, FILTER_VALIDATE_INT)) {
die('Not an int!');
}
echo "Var has the value $var.\n";
最好在从cli,Web客户端等过滤输入时使用。List of filters here。
答案 4 :(得分:1)
关注文档。 is_numeric
将始终可用,并且仅验证您有一个可被PHP视为数字的字符串。 ctype_*
函数的范围稍窄,但也应始终可用。
RegO是IMO,对此类支票来说过度杀伤。
答案 5 :(得分:0)
我不是PHP方面的专家,但您是否考虑过编写数据驱动单元测试以获得对这些功能的具体理解。如果你不确定它们的可靠性并且文档不清楚,那么没有什么比单元测试能够测试1000的排列和它们的预期输出。
你甚至不必去那么远,因为我想你只想测试一些特殊的边缘情况。您的编程技巧和编译器是您最好的朋友。你写的程序将证实或否认你的怀疑。
此外,要获得奖金,您可以监控每种方法花费多长时间,看看哪种方法更有效。
只是一个想法。
答案 6 :(得分:0)
我不确定为什么你不会只使用intval。毕竟,你的正则表达式甚至不会考虑负数,而intval会(虽然这可能是你想要的?)。
甚至只是转换为int,这避免了一些可以偷偷摸摸地使用intval的深奥浮点“陷阱”。