我试图检查,输入是整数,浮点数或字符串。这个程序给出了负输入错误,我不明白为什么会这样。当我使用“ctype_digit()”检查输入时,is_int部分已转义。
<?php
$var=fgets(STDIN);
if(is_numeric($var))
{
//print "$var";
if(ctype_digit($var) || is_int($var)){
print "$var";
print "This type of input is Integer";
}
else{
//print "$var";
print "This type of input is Float";
}
}
else{
print "This type of input is String";
}
?>
答案 0 :(得分:4)
从PHP手册:
注意:强> 此函数需要一个字符串才有用,因此例如传入一个整数可能不会返回预期的结果。但是,请注意HTML表单将导致数字字符串而不是整数。另请参阅手册的类型部分。
注意:强> 要测试变量是数字还是数字字符串(例如表单输入,始终是字符串),必须使用is_numeric()。
使用像 filter_var($ var,FILTER_VALIDATE_INT)这样的过滤器进行整数评估。
<?php
$var = -10.12;
if(is_numeric($var))
{
//print "$var";
if(filter_var($var, FILTER_VALIDATE_INT)){
var_dump(filter_var($var, FILTER_VALIDATE_INT));
print "$var";
print "This type of input is Integer";
}
else{
//print "$var";
print "This type of input is Float";
}
}
else{
print "This type of input is String";
}
?>
答案 1 :(得分:0)
ctype因负数而失败,因为减号(“ - ”)不被视为POSIX数字字符类([0-9。])的一部分。我的PHP(5.3)也失败,负字符串'-1'。
尽管其他人已经说过,filter_vars()不是合适的解决方案。它可能是可行的,但OP正在测试原始值,而不是尝试清理用户输入。他也在问为什么ctype()不起作用,以及为什么这样做的变量测试。 filter_vars()在其他常见的php版本(&lt; 5.2)中也不起作用。此外,他的测试可以在没有添加函数调用的情况下执行。
代替: if(ctype_digit($ var)|| is_int($ var))
施展它。
foreach (array (-1, 0, 1,1.1,'1.1','1','abc','0','-1') as $test)
{
if (is_numeric($test))
{
if ((int) $test == $test) // <-- HERE
{ echo "int: $test\n"; }
else
{ echo "float: $test\n"; }
}
else
{ echo "string: $test\n"; }
}
/*
returns:
int: -1
int: 0
int: 1
float: 1.1
float: 1.1
int: 1
string: abc
int: 0
int: -1
*/
注意:(int)会将任何非整数字符串转换为“1”,而对字符串的==也会将字符串转换为1,因此对于“abc”,(int)'abc'= ='abc'将产生1 == 1。这意味着要么必须先进行数字字符串测试,要么先进行其他一些纯字符串测试。
注意2:带空格的字符串会失败。例如“1”。也许添加$var=is_string($var) ? trim($var) : $var;