Reputation: 42113
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
Reputation: 394
if(!preg_match('/^[0-9]+$/', $input)) {
Deprecated: Function ereg() is deprecated
Upvotes: 0
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
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
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
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