【问题标题】:is_numeric, intval, ctype__digit.. can you rely on them?is_numeric、intval、ctype__digit.. 你能依赖它们吗?
【发布时间】:2010-10-02 12:33:06
【问题描述】:

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

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

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

你们怎么看?我傻吗?

【问题讨论】:

    标签: php regex numeric


    【解决方案1】:

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

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

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

    只是一个想法。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

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

        【讨论】:

        • 不要忘记 ctype 比普通 is_numeric 快 3 倍
        【解决方案4】:

        您也可以使用新的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

        【讨论】:

          【解决方案5】:

          你命名了两种函数:

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

          过滤器会更改给定值,使新值具有给定特征,因此将是有效
          intval和@987654324 @ 是过滤函数,因为它们总是会返回可以通过验证器的有效值。

          【讨论】:

            【解决方案6】:

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

            国际海事组织,RegEx 对于此类检查来说太过分了。

            【讨论】:

              【解决方案7】:

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

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

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

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

              【讨论】:

              • 请注意ctype_digit(10) 也将是false,因为它只适用于字符串。在进行验证之前,您应该转换为字符串:ctype_digit((string)10) 返回true
              猜你喜欢
              • 1970-01-01
              • 2017-09-01
              • 1970-01-01
              • 2013-02-24
              • 2011-09-27
              • 2022-01-18
              • 2012-09-22
              • 2014-07-14
              • 1970-01-01
              相关资源
              最近更新 更多