“is_int”工作不正常?

时间:2016-07-24 03:18:36

标签: php

我试图检查,输入是整数,浮点数或字符串。这个程序给出了负输入错误,我不明白为什么会这样。当我使用“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";
}
?>

2 个答案:

答案 0 :(得分:4)

从PHP手册:

ctype_digit

  

注意:   此函数需要一个字符串才有用,因此例如传入一个整数可能不会返回预期的结果。但是,请注意HTML表单将导致数字字符串而不是整数。另请参阅手册的类型部分。

is_int

  

注意:   要测试变量是数字还是数字字符串(例如表单输入,始终是字符串),必须使用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;