Naveed
Naveed

Reputation: 42113

Shortest way to check if a variable contains positive integer using PHP?

I want to check if user input a positive integer number.

1    = true
+10  = true
.1   = false
-1   = false
10.5 = false


Just a positive number. 
No characters.
No special character.
No dot.
No minus sign.

I tried is_int() function but it is returning false even on positive integers. Is there a string to int problem?

Upvotes: 19

Views: 27005

Answers (6)

Nopcea Flavius
Nopcea Flavius

Reputation: 303

the easiest way is:

if intval($x) > 0 {
 echo "true"
}

Upvotes: 1

hram908
hram908

Reputation: 394

if(!preg_match('/^[0-9]+$/', $input)) {

Deprecated: Function ereg() is deprecated

Upvotes: 0

Decko
Decko

Reputation: 19385

I would say this is the best way

if (is_int($num) && $num > 0)

as typecasting to an int is very slow.

Upvotes: 3

Imabigfatseacow
Imabigfatseacow

Reputation: 31

I use a regular expression. Very simple if you think about it. You need more punctuation marks if you want to make a number not a whole positive integer (minus sign and a period). So this just makes sure the only thing you have are numbers 0-9 for the value.

if(!ereg('^[0-9]+$', $value)) {
  $errors .= "This is not a positive whole number";
}

You could add another part on there to make sure it is less than a certain amount of characters as well. Hope this helps.

Upvotes: 3

Gordon
Gordon

Reputation: 317119

Try the native Filter function*

filter_var($value, FILTER_VALIDATE_INT, array(
    'options' => array('min_range' => 1)
));

* if you just want to make sure the input string consists of an arbitrary length digit sequence, use a regex with [0-9] or [\d+]

Examples with filter_var:

var_dump( filter_var(1, FILTER_VALIDATE_INT) ); // int(1)

var_dump( filter_var('1', FILTER_VALIDATE_INT) ); // int(1)

var_dump( filter_var('+10', FILTER_VALIDATE_INT) ); // int(10)

var_dump( filter_var(.1, FILTER_VALIDATE_INT) ); // bool(false)

var_dump( filter_var('.1', FILTER_VALIDATE_INT) ); // bool(false)

var_dump( filter_var(-1, FILTER_VALIDATE_INT, 
    array('options' => array('min_range' => 1))) ); // bool(false)

var_dump( filter_var('-1', FILTER_VALIDATE_INT, 
    array('options' => array('min_range' => 1))) ); // bool(false)

var_dump( filter_var('2147483648', FILTER_VALIDATE_INT) ); // bool(false)

var_dump( filter_var('0xFF', FILTER_VALIDATE_INT) ); // bool(false)

var_dump( filter_var(0xFF, FILTER_VALIDATE_INT) ); // int(255)

Upvotes: 31

Yacoby
Yacoby

Reputation: 55465

Something like this should work. Cast the value to an integer and compare it with its original form (As we use == rather than === PHP ignores the type when checking equality). Then as we know it is an integer we test that it is > 0. (Depending on your definition of positive you may want >= 0)

$num = "20";

if ( (int)$num == $num && (int)$num > 0 )

Upvotes: 36

Related Questions