如何检查一个string是一个int,但不是一个double等?

PHP有一个intval()函数,可以将string转换为整数。 不过,我想检查string是一个整数预先,以便我可以给用户一个有用的错误信息,如果它是错误的。 PHP有is_int() ,但是像"2"这样的string返回false。

PHP有is_numeric()函数,但是如果数字是double,那么它将返回true。 我想要的东西,将返回一个双精度为f​​alse,但真正的一个int。

例如:

 my_is_int("2") == TRUE my_is_int("2.1") == FALSE 

如何使用ctype_digit

从手册:

 <?php $strings = array('1820.20', '10002', 'wsl!12'); foreach ($strings as $testcase) { if (ctype_digit($testcase)) { echo "The string $testcase consists of all digits.\n"; } else { echo "The string $testcase does not consist of all digits.\n"; } } ?> 

上面的例子会输出:

string1820.20不包含所有数字。
string10002由所有数字组成。
stringwsl!12不包含所有数字。

这只会在你的input总是一个string时才起作用:

 $numeric_string = '42'; $integer = 42; ctype_digit($numeric_string); // true ctype_digit($integer); // false 

如果你的input可能是inttypes,那么把ctype_digitis_int结合起来。

如果您关心的是负数,那么您需要检查前面的input,如果是, ctype_digit在inputstring的substr上调用ctype_digit 。 像这样的事情会做到这一点:

 function my_is_int($input) { if ($input[0] == '-') { return ctype_digit(substr($input, 1)); } return ctype_digit($input); } 

filter_var应该这样做:

 var_dump(filter_var('2', FILTER_VALIDATE_INT)); // 2 var_dump(filter_var('2.0', FILTER_VALIDATE_INT)); // false var_dump(filter_var('2.1', FILTER_VALIDATE_INT)); // false 

 var_dump(filter_var(2, FILTER_VALIDATE_INT)); // 2 var_dump(filter_var(2.0, FILTER_VALIDATE_INT)); // 2 var_dump(filter_var(2.1, FILTER_VALIDATE_INT)); // false 

如果你只是想要布尔值作为返回值,将其包装成一个函数,例如

 function validatesAsInt($number) { $number = filter_var($number, FILTER_VALIDATE_INT); return ($number !== FALSE); } 

+1给Dominic的答案(使用ctype_digit )。 另一种方法是使用types强制:

 $inty = "2"; $inty2 = " 2"; $floaty = "2.1"; $floaty2 = "2.0"; is_int($inty + 0); // true is_int($floaty + 0); // false is_int($floaty2 + 0); // false // here's difference between this and the ctype functions. is_int($inty2 + 0); // true ctype_digit($inty2); // false 

将其转换为int。 如果它的int值仍然相同,

 function my_is_int($var) { $tmp = (int) $var; if($tmp == $var) return true; else return false; } 
 /** * Check if a number is a counting number by checking if it * is an integer primitive type, or if the string represents * an integer as a string */ function is_int_val($data) { if (is_int($data) === true) return true; if (is_string($data) === true && is_numeric($data) === true) { return (strpos($data, '.') === false); } } 

来源 。

最近需要一个强大的is_int 。 我发现intval()太不可预知了:

 intval(array('foo', 'bar')) //returns 1 ?!? intval("2dog") //returns 2 even though the value is definitely not an integer intval("dog2") //also returns 2 

在PHP文档注释中find这个代码片段,在testing之后,它几乎涵盖所有的东西:

 function my_is_int($s) { return (is_numeric($s) ? intval($s) == $s : false); } 

 my_is_int(2); //true my_is_int("2"); //true my_is_int(2.1); //false my_is_int("2.1"); //false my_is_int("dog"); //false my_is_int("2dog"); //false my_is_int("dog2"); //false my_is_int(array('foo', 'bar')); //false my_is_int(array(1)); //false 

但小心:

 my_is_int(2.0); //true my_is_int("2.0"); //true 
 function my_is_int($var) { return preg_match('/^\d+$/', $var); } 

我正在使用这个:

 function isInt($val){ return (filter_var($val, FILTER_VALIDATE_INT) !== false && strpos($val, '-') === false); } var_dump (isInt("1")); 

你可以只检查一个数字,如果是的话检查比铸造是否加倍或不加:

 ((is_numeric($var) && !is_double(1*$var))); 

只是为了正数:

 (is_numeric($var) && !is_double(1*$var)) && ($var >= 0) 

检查它:

 $numbersToCheck = array("a", "-1", "1", "1.0", "1.2"); foreach ($numbersToCheck as $var) { echo $var . " is integer? ";var_dump((is_numeric($var) && !is_double(1*$var))); echo $var . " is a positive integer? ";var_dump((is_numeric($var) && !is_double(1*$var)) && ($var >= 0)); } 

输出:

 a is integer? bool(false) a is a positive integer? bool(false) -1 is integer? bool(true) -1 is a positive integer? bool(false) 1 is integer? bool(true) 1 is a positive integer? bool(true) 1.0 is integer? bool(false) 1.0 is a positive integer? bool(false) 1.2 is integer? bool(false) 1.2 is a positive integer? bool(false) 

尝试这个:

 $string='12abc'; if ((int)$string==$string) var_dump((int)$string); else echo 'Invalid!'; // Outputs: Invalid! $string='789'; if ((int)$string==$string) var_dump((int)$string); else echo 'Invalid!'; // Outputs: int 789 $string='345.00'; if ((int)$string==$string) var_dump((int)$string); else echo 'Invalid!'; // Outputs: 345 $string='123.01'; if ((int)$string==$string) var_dump((int)$string); else echo 'Invalid!'; // Outputs: Invalid! 

如果您的$string有小数位也工作

这也会照顾负数

 function myIsInt() { return (is_numeric($var) AND (is_int($var) OR ctype_digit(trim($var, '-')))) } //'234-' => false //'-234' => true //'--234' => false //'234' => true 

怎么样:

 function isIntStr($str) { return preg_match('/^(-?\d+)(?:\.0+)?$/', trim($str), $ms) && bcComp($ms[1], PHP_INT_MAX) <= 0 && bcComp($ms[1], -PHP_INT_MAX - 1) >= 0; } 

这个函数只能返回任何可以用int (int)intval()为int的string,而不会丢失math意义的任何东西(比如小数点后面的非零或PHP整数范围之外的数字)这在math上不是重要的(例如空白;前导零;或者小数点后面的零)。

它将返回“ '10.'错误'10.' 但不是'10.0' 。 如果你想'10.' 为true,你可以将正则expression式中的0改为*

这里我使用的一些代码似乎运行良好,并没有任何其他许多问题。

 if (0 != strlen(str_replace(range(0, 9), '', $TestInt))) { print 'Not an integer!';} 

它不检查顺序等,所以不意味着消极的整数,但有一些额外的代码,可以使用上面的一些其他的想法。 它也可以适应与二进制array('0', '1')或hex等工作。

看到这个 将$ val转换为整数,然后检查转换为string的原始$ val是否为IDENTICAL(===) – 只是==不会按预期工作 – 将整数val转换为string。

 function validInt($val, $min=null, $max=null) { $ival = intval($val); //echo "'$ival' '$val'<br>\n"; // Uncomment to see the comparisons done in below if block if(''.$ival !== ''.$val) { return false; } if($min !== null && $ival < $min) return false; if($max !== null && $ival > $max) return false; return true; } 

如果您不检查string值,则可能无法正常工作:

 $nums = array( '1', '+1', '-1', '01', '1.0', '.0', '1.123', 'a123', '0x101010', 1, -1, 01, 1.0, .0, 1.123, 0x101010, ); foreach($nums as $num) { if(validInt2($num)) echo $num." - Valid integer.<br>\n"; else echo $num." - Not a valid integer.<br>\n"; } 

输出:

 1 - Valid integer. +1 - Not a valid integer. -1 - Valid integer. 01 - Not a valid integer. 1.0 - Not a valid integer. .0 - Not a valid integer. 1.123 - Not a valid integer. a123 - Not a valid integer. 0x101010 - Not a valid integer. 1 - Valid integer. -1 - Valid integer. 1 - Valid integer. 1 - Valid integer. 0 - Valid integer. 1.123 - Not a valid integer. 1052688 - Valid integer. 

原因是即使使用hex(0x101010),八进制(01)或以浮点forms存储的整数(1.0,0.0),内部也都以浮点forms存储。 但是,如果您使用函数来检查存储为string的int,它将起作用。

 public static function isNumeric($value, $negativ = false) { return is_int($value) || is_string($value) && ( ctype_digit($value) || ( $negativ && $value{0} == '-' && ctype_digit(substr($value, 1)) ) ); //alternativ: //return $value == (int) $value; } 
 function my_is_int($var){ return is_numeric($var) && gettype($var+0)=='integer'; } 

您可以使用以下条件。 注意你不应该使用!==

 $value = 12; // true $value = '12'; // true $value = 'abc'; // false $value = 12.1; // false $value = '12.1'; // false if (!is_numeric($value) || (int) $value != (float) $value) { echo "false"; } else { echo "true"; } 

我devise了一种我找不到的方式,所以我把它放在这里:

没有进一步的ctype_digit((string) abs($input))它是这样的: ctype_digit((string) abs($input))

例:

 function means_int($input) { return ctype_digit((string) abs($input)); } $list = array( 0, '0', 1, '1', 1.1, '1.1', 2.0, '2.0', 2.6, '2.6', -4, '-4', -3.2, '-3.2', -30.02, '-30.02', 100.00, '100.00', ); foreach ($list as $x) { var_dump($x); var_dump(means_int($x)); echo PHP_EOL; } 

结果:(如我所料,是预期的)

 int(0) bool(true) string(1) "0" bool(true) int(1) bool(true) string(1) "1" bool(true) float(1.1) bool(false) string(3) "1.1" bool(false) float(2) bool(true) string(3) "2.0" bool(true) float(2.6) bool(false) string(3) "2.6" bool(false) int(-4) bool(true) string(2) "-4" bool(true) float(-3.2) bool(false) string(4) "-3.2" bool(false) float(-30.02) bool(false) string(6) "-30.02" bool(false) float(100) bool(true) string(6) "100.00" bool(true) 

也许不是这样做的最高性能的方式。 但是,你可以写在一行。

 function my_is_int($input) { return intval($input).'' === $input.''; } 

正如所料:

  my_is_int(1); // TRUE my_is_int(-1); // TRUE my_is_int(1.2); // FALSE my_is_int("1"); // TRUE my_is_int("-1"); // TRUE my_is_int("1.2"); // FALSE my_is_int(0); // TRUE my_is_int(null); // FALSE 

疑难杂症:

  my_is_int(1.0); // TRUE my_is_int("1.0"); // FALSE 

几年后,但基于这里给出的答案,我想出了一个解决scheme,比其他大多数答案更准确(特别是布尔值),更有效率(我认为):

 function my_is_int($s) { return ctype_digit($s) || is_int($s); } 

按预期工作:

 my_is_int(2); // true my_is_int("2"); // true my_is_int(-2); // true my_is_int(2.0); // false my_is_int("2.0"); // false my_is_int(2.1); // false my_is_int("2.1"); // false my_is_int("dog"); // false my_is_int("2dog"); // false my_is_int("dog2"); // false my_is_int(array('foo', 'bar')); // false my_is_int(array(1)); // false my_is_int(true); // false my_is_int(false); // false my_is_int("true"); // false my_is_int("false"); // false my_is_int("0x101010"); // false 

除了这些2:

 my_is_int(0x101010); // true my_is_int("-2"); // false 

可以使用is_numeric()然后检查是否存在“。” 在string(不特别文化敏感,但)。

或者,使用is_numeric()然后强制转换为double,并查看$ var == floor($ var)(如果是整数,则返回true)。