Home » Php » php – Checking if a string contains an integer

php – Checking if a string contains an integer

Posted by: admin April 23, 2020 Leave a comment

Questions:

Do you know of a function that can check if a string contains 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.
How to&Answers:
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

See Gordon’s answer below for how this would behave differently if === were used for comparison instead of ==.

Answer:

Not the fastest method, but filter_var() is quite accurate:

function test($s)
{
    return filter_var($s, FILTER_VALIDATE_INT) !== false;
}

Here are the results based on Jhong’s answer, differences marked with !!:

var_dump(test(1)            ); // true
var_dump(test('1')          ); // true
var_dump(test('1.0')        ); // false !!
var_dump(test('1.1')        ); // false
var_dump(test('0xFF')       ); // false
var_dump(test('0123')       ); // false !!
var_dump(test('01090')      ); // false !!
var_dump(test('-1000000')   ); // true
var_dump(test('+1000000')   ); // true
var_dump(test('2147483648') ); // true !! on 64bit
var_dump(test('-2147483649')); // true !! on 64bit

To allow octal integers:

function test($s)
{
   return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL) !== false;
}

Results:

var_dump(test('0123') ); // true
var_dump(test('01090')); // false !!

To allow hexadecimal notation:

function test($s)
{
   return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX) !== false;
}

Results:

var_dump(test('0xFF')); // true !!

Answer:

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

Answer:

Update Since PHP 7.1 there are problems with using is_int() with non-numeric values, as discussed in this SO Answer. In any case, this is a very old answer and I’d really view it as something of a hack at this point so YMMV 😉

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 🙂

Answer:

Other option

function holds_int($str)
   {
   return preg_match("/^-?[0-9]+$/", $str);
   }

Answer:

If the string contains spaces, then @Jack’s answer will not provide accurate result.
e.g.

$var = '19   ';
if((string)(int)$var == $var) {
echo 'var is an integer or a string representation of an integer';
}

The above string will not be an int according to the above check.

So instead of using this, try following:

if(ctype_digit(trim('19  '))){
    echo 'it is digit ';
}else{
    echo 'it is not digit ';
}

Answer:

ctype_digit will do the trick:

ctype_digit($str)

  1. $str has to be a string
  2. extra spaces are not allowed
  3. no decimal points .

Answer:

Maybe this will also help in given situation
there is a function in php that already does this, its called “is_numeric()”
it will return true or false accordenly..

   if(is_numeric($somestring) == True){
        echo "this string contains a integar";
    }

link: http://www.php.net/is_numeric

you said “holdsint(“2”) should return true, well is_numeric(“2”) returns True, and is_numeric(“a”) False, as expected, this function exists in php, no need to rewrite.

Answer:

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

Answer:

There may be two cases-

  1. You need to check for exact string format of a number(most of ans is about this one)

  2. You want to check, whether a string contains a specific number or not

    preg_match('/'.$matching_number.'/',$container_string);

Answer:

I liked nyson’s suggestion, but noticed that it will be false for ‘0123’.
I’m now doing this:

(string)(int)$var === ltrim((string)$var, '0')

(This would have been posted as a comment @nyson, but I don’t have enough privileges to do that yet).

Edited to add:
If you want zero to be true, you need to do something like

(int)$var === 0 || (string)(int)$var === ltrim((string)$var, '0')

Answer:

I’ve been using this since long time.
If you want to detect any possible int valued thing, including 1.0 “1.0” 1e3 “007” then you better let is_numeric do its job to detect any possible PHP object that represents a number, and only then check if that number is an int.

function isIntValued($var) {
    if(is_numeric($var)) { // At least it's number, can be converted to float
        $var=(float)$var; // Now it is a float
        return ((float)(int)$var)===$var;
    }
    return FALSE;
}

or in short

function isIntValued($var) {
    return (!is_numeric($var)?FALSE:((float)(int)(float)$var)===(float)$var);
}

Note that while PHP’s is_int() checks if the type of variable is an integer, on the contrary the other standard PHP function is_numeric() determines very accurately if the contents of the variable (i.e. string chars) can represent a number.

Answer:

If you use Assert library in you project (https://github.com/beberlei/assert) you can easily do it in one line:

Assertion::integerish($var);

Note: it throws an exception in case of violation the assertion.

Answer:

is_int is the only what it’s meant to do this work.