8

is_numeric、intval、ctype__digit.. 你能依赖它们吗?

还是我必须使用正则表达式?

函数 isNum($str) {
return (preg_match("/^[0-9]+$/", $str));
}

你们有什么感想?我傻吗?

4

7 回答 7

18

ctype_digit和之间的一个重要区别is_numerict是负值和浮点数。

is_numeric(-10)将返回true而 'ctype_digit(-10)' 将是false

ctype_digit(12.50)将返回falseis_numeric(12.50)将是true

所以它们都很方便取决于你的域逻辑的上下文。

于 2014-10-02T08:46:40.080 回答
13

is_numeric、intval 和 ctype_digit 都做了非常不同的事情。

is_numeric将告诉您变量的内容是否为数字(即如果它是浮点或整数值则为真)。

intval尝试将一串数字转换为整数值

ctype_digit将告诉您字符串是否只包含数字字符(将执行与 isNum 函数相同的检查)。

最好的方法可能是检查 is_numeric 是否为真,然后使用 settype($myvalue, 'integer') 或 intval($myvalue);

于 2009-01-20T18:28:27.867 回答
5

您命名了两种函数:

Validator检查给定值是否具有给定特征并返回truefalse
is_numericctype_*函数和你的isNum函数是验证函数,因为它们只是告诉你一个值是否有效。

过滤器以新值具有给定特征的方式更改给定值,因此将是有效的。
intval并且这些filter_*函数是过滤函数,因为它们总是会返回可以通过验证器的有效值。

于 2009-01-20T20:53:04.160 回答
2

You can also use the new filter functions.

if (!$var = filter_var($var, FILTER_VALIDATE_INT)) {
  die('Not an int!');
}

echo "Var has the value $var.\n";

Best used when filtering input from cli, web client, etc. List of filters here.

于 2009-01-20T19:36:17.997 回答
1

按照文档。is_numeric将始终可用,并且仅验证您有一个可以被 PHP 视为数字的字符串。这些ctype_*功能的范围有点窄,但也应该始终可用。

IMO 对此类检查来说,RegEx 是矫枉过正的。

于 2009-01-21T03:31:32.420 回答
0

我不是 PHP 专家,但您是否考虑过编写数据驱动的单元测试来具体了解这些功能。如果您不确定它们的可靠性并且文档不清楚,那么没有什么比可以测试 1000 个排列及其预期输出的单元测试更好的了。

您甚至不必像我想象的那样走那么远,您只想测试一些特殊的边缘情况。您的编程技能和编译器是您最好的朋友。您编写的程序将确认或否认您的怀疑。

此外,为了获得奖励,您可以监控每种方法需要多长时间,并查看哪种方法性能更高。

只是一个想法。

于 2009-01-20T18:21:44.887 回答
0

我不确定你为什么不只使用intval。毕竟,您的正则表达式甚至没有考虑负数,而 intval 会(尽管也许这就是您想要的?)。

或者甚至只是强制转换为 int,这样可以避免一些深奥的浮点“陷阱”,这些问题可能会与 intval 一起偷偷摸摸。

于 2009-01-20T18:24:28.640 回答