开发者

Checking if a string contains an integer

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("开发者_Go百科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

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


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 !!


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


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 :)


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 .


Other option

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


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 ';
}


I've been using this since long time. While all the other answers have drawbacks or special cases, 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 really an int, converting it to int and back to float, and testing if it changed value.:

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);
}

Or

 function isIntValued($var) {
    return (is_numeric($var) && ((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.

If, instead, you want "1.0" and "2.00" not to be considered integers but floats (even if they have an integer value), then the other answer ( @Darragh Enright ) using is_numeric, adding zero and testing for int is probably the most correct solution:

    is_numeric($s) && is_int($s+0)


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.


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


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);


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')


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.


Seeing that you are searching for a value in a string, I'd go for:

(bool) preg_match('/^\d+$/', '23'); // true
(bool) preg_match('/^\d+$/', '2.3'); // false
(bool) preg_match('/^\d+$/', 'qwe'); // false


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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜