Do you know of a function that can check if a string holds an integer?
Here's how I'd expect it to work:
holds_int("23") // should return true.
holds_int("2.3") // should return false.
holds_int("qwe") // should return false.
Do you know of a function that can check if a string holds an integer?
Here's how I'd expect it to work:
holds_int("23") // should return true.
holds_int("2.3") // should return false.
holds_int("qwe") // should return false.
if((string)(int)$var == $var) {
echo 'var is an integer or a string representation of an integer';
}
Example results:
var_dump( test(1) ); // TRUE
var_dump( test('1') ); // TRUE
var_dump( test('1.0') ); // TRUE
var_dump( test('1.1') ); // false
var_dump( test('0xFF') ); // false
var_dump( test('0123') ); // TRUE
var_dump( test('01090') ); // TRUE
var_dump( test('-1000000') ); // TRUE
var_dump( test('+1000000') ); // TRUE
var_dump( test('2147483648') ); // false
var_dump( test('-2147483649') ); // false
Other option
function holds_int($str)
{
return preg_match("/^-?[0-9]+$/", $str);
}
There may be two cases-
You need to check for exact string format of a number(most of ans is about this one)
You want to check, whether a string contains a specific number or not
preg_match('/'.$matching_number.'/',$container_string);
Dont want to accidently turn Jhong's answer into a CW, so for the record here is the results when testing with ===
instead of ==
.
function test($var) {
return ((string)(int)$var === $var);
}
var_dump( test(1) ); // returns false vs TRUE
var_dump( test('1') ); // returns TRUE
var_dump( test('1.0') ); // returns false vs TRUE
var_dump( test('1.1') ); // returns false
var_dump( test('0xFF') ); // returns false
var_dump( test('0123') ); // returns false vs TRUE
var_dump( test('-0123') ); // returns false vs TRUE
var_dump( test('-1000000') ); // returns TRUE
var_dump( test('+1000000') ); // returns false vs TRUE
var_dump( test('2147483648') ); // returns false
var_dump( test('-2147483649') ); // returns false
comparison.php:
<?php
function is_numeric_int($s)
{
return (strval(intval($s)) === $s);
}
function print_ini($s)
{
echo "$s: " . ( is_numeric_int($s) ? 'true' : 'false' ) . "\n";
}
print_ini('qwe');
print_ini('23');
print_ini('-23');
print_ini('23.0');
print_ini('-23.0');
?>
Test run:
$ php comparison.php
qwe: false
23: true
-23: true
23.0: false
-23.0: false
function is_stringified_int($str) {
return isset($str[0]) && false !== strpos('-0123456789', $str[0]) && !isset($str[strcspn($str, '0123456789', 1)]);
}
What it does: First checks that first string offset is set. (''
isn't an int.) Then is checks whether the first string offset is a digit or -
. And than it checks that all the other characters are only digits.
Little bit hacky, but doesn't use regex. I don't even know, whether this is faster than regex.
Sorry if this question has been answered but this has worked for me in the past:
First check if the string is_numeric
. if it is add a 0
to the value to get PHP to covert the string to its relevant type. Then you can check if it's an int with is_int
. Quick and dirty but it works for me...
$values = array(1, '2', '2.5', 'foo', '0xFF', 0xCC, 0644, '0777');
foreach ($values as $value) {
$result = is_numeric($value) && is_int(($value + 0)) ? 'true' : 'false';
echo $value . ': ' . $result . '<br />';
}
Results:
1: true
2: true
2.5: false
foo: false
0xFF: true
204: true
420: true
0777: true
The only problem is that it will evaluate octal values wrapped in a string literally, i.e: '0123' will simply become 123. But that's easy to address :)