我有一个工作函数(我认为)正确检测有效整数,如(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;
}
答案 0 :(得分:2)
我认为你在这里混淆了一些术语。 0x0a
是一个整数 - 它相当于十进制10
。您没有尝试检测整数,而是试图检测整数的十进制表示,这是另一回事。
在PHP中,与许多其他语言一样,整数是整数。在引擎盖下,所有这些值都是等效的并以相同的方式存储在内存中。
10 # decimal
012 # octal
0x0a # hexadecimal
00001010 # binary
大多数这些语言都是用C或C ++实现的,并使用其中一个C int
系列来存储这些值。
即使您可以使用其他格式(如八进制或十六进制)指定它们,并且可以将它们格式化为输出,它们仍然是内存中的整数值。
我怀疑你最好的选择是使用正则表达式。但是,这取决于是否有可用的字符串表示。因为猜测当你将整数转换为字符串时会发生什么......是的,你得到十进制表示。
echo strval(0x0a);
# outputs "10"
在PHP中显示此问题的示例:
$x = 10;
$y = 012;
$z = 0x0a;
echo "x:$x y:$y z:$z\n";
foreach (array(10, 012, 0x0a) as $i) {
echo var_dump($i);
echo var_export($i) . "\n";
}
输出:
x:10 y:10 z:10
INT(10)
10个
INT(10)
10个
INT(10)
10
在这种情况下,PHP并不是唯一的。其他语言表现完全相同。
w = 10
x = 0o12
y = 0x0a
z = 0b1010
print('w:{} x:{} y:{} z:{}'.format(w, x, y, z))
for i in (10, 0o12, 0x0a, 0b1010):
print(repr(i), i)
输出:
w:10 x:10 y:10 z:10
10 10
10 10
10 10
10 10
use strict;
use Data::Dumper;
my $x = 10;
my $y = 012;
my $z = 0x0a;
print "x:$x y:$y z:$z\n";
for my $i (10, 012, 0x0a) {
print Dumper($i);
}
输出:
x:10 y:10 z:10
$ VAR1 = 10;
$ VAR1 = 10;
$ VAR1 = 10;
#include <stdio.h>
int main(void) {
int x = 10;
int y = 012;
int z = 0x0a;
printf("%d %d %d\n", x, y, z);
printf("0%o 0%o 0%o\n", x, y, z);
printf("0x%x 0x%x 0x%x\n", x, y, z);
return(0);
}
输出:
10 10 10
012 012 012
0xa 0xa 0xa
答案 1 :(得分:0)
正如@Dan Lowe所写:
据我所知,这是不可能发现的。十六进制,八进制,二进制表示只是格式化。整数始终是内存中的数值。许多语言都是相同的,例如在这种情况下,Python会做同样的事情,如x = 0x0a;打印(X); - 将返回10作为结果。