如何检查一个string是一个int,但不是一个double等?
PHP有一个intval()
函数,可以将string转换为整数。 不过,我想检查string是一个整数预先,以便我可以给用户一个有用的错误信息,如果它是错误的。 PHP有is_int()
,但是像"2"
这样的string返回false。
PHP有is_numeric()
函数,但是如果数字是double,那么它将返回true。 我想要的东西,将返回一个双精度为false,但真正的一个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可能是int
types,那么把ctype_digit
和is_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)。