【发布时间】:2016-01-25 16:06:12
【问题描述】:
我有一个工作函数(我认为)可以正确检测像(int) 0, -1, +1 和(string) '0', '-1', '+1' 这样的有效整数,但是该函数失败并且十六进制值也被检测为整数。这意味着如果我将整数值 0x0a 传递给函数,它会返回 true。这只影响if (is_int($input) === true) { 部分。我怎样才能避免这种情况发生?
工作示例:
function isInteger($input)
{
if (is_scalar($input) === false) {
return false;
}
if (intval($input) == $input) {
if (is_string($input) === true && ctype_digit(ltrim($input, '+-')) === true) {
return true;
} else
if (is_int($input) === true) {
return true;
}
}
return false;
}
【问题讨论】:
-
不起作用,php 以某种方式将存储在变量中的值转换为整数,例如:testHexValue = 0x0a;变为 testHexValue = 10;。可悲的是。正则表达式只有在 0x0a 值是像 testHexValue = '0x0a'; 这样的字符串时才有效
-
您在这里混淆了您的条款。
0x0a是一个整数 - 它相当于十进制10。您不是在尝试检测整数,而是在尝试检测整数的 十进制 表示,这是另一回事。你可能不得不求助于正则表达式来做你想做的事。 php.net/manual/en/language.types.integer.php -
谢谢@DanLowe。是的,你是对的,我正在尝试检测整数的十进制表示。以这种方式编写
decvalue = 0x0a;是否可能,因为当我执行var_dump()或var_export()时,我得到的只是十进制10,正如你所写的那样。 -
据我所知,无法检测到这一点。十六进制、八进制、二进制表示只是格式化。整数始终是内存中的数值。许多语言是相同的,例如在这种情况下,Python 会做同样的事情,就像在
x = 0x0a; print(x);中一样 - 将返回10作为结果。 -
我有一种感觉,在这种情况下,我必须分别对字符串和整数中的数字进行验证。我是如此接近解决一个总是困扰我的问题,但是随着验证布尔值的出现,然后......我必须重新考虑我的验证策略。谢谢@DanLowe,非常感谢您的回答。