2010-04-01 20 views
18

Quiero verificar si el usuario ingresó un número entero positivo.¿La forma más corta de verificar si una variable contiene un entero positivo usando PHP?

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. 

me trataron is_int() función pero está volviendo falsa incluso en números enteros positivos. ¿Hay una cadena en el problema int?

+0

* (relacionado) * http://stackoverflow.com/questions/2524680/check-whether-the-string-is-a-unix-timestamp/2524761#2524761 – Gordon

+3

¿qué debería devolver por "+3928742938749283479823749283749"? – user187291

+0

@stereofrog: la validación de la longitud del cuadro de texto puede bloquearlo por este valor en mi aplicación :) – NAVEED

Respuesta

32

Algo como esto debería funcionar. Eche el valor a un número entero y compárelo con su forma original (Como usamos == en lugar de === PHP ignora el tipo al verificar la igualdad). A continuación, tal como la conocemos es un número entero que se prueba que es> 0. (En función de la definición de positivo es posible que desee >= 0)

$num = "20"; 

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

Llamada a la función indefinida int() error – NAVEED

+10

@NAVEED Puede ser porque estás haciendo 'int ($ num)'.La conversión se realiza rodeando el tipo al que desea convertir entre corchetes. En este caso '(int) $ num'. – Yacoby

+0

Su funcionamiento. Gracias. – NAVEED

29

Pruebe el nativo Filter function *

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

* si solo desea asegurarse de que la cadena de entrada consiste en una secuencia de dígitos de longitud arbitraria, use una expresión regular con [0-9] o [\ d +]

Ejemplos con 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) 

+0

y ¿qué hay de abcd, 123d, 10.5 y (espacio)? – NAVEED

+0

@NAVEED pruébate y dime :) Predigo todo 'falso' – Gordon

+0

Tienes que esperar ... salir;) – NAVEED

1

la forma más fácil es:

si intval ($ x)> 0 echo "verdadera"

+0

intval ('1e10'); // 1 e intval ('420000000000000000000'); // 2147483647 – Gordon

2

utilizo un habitual expresión. Muy simple si lo piensas Necesita más signos de puntuación si quiere hacer un número entero no positivo completo (signo menos y punto). Así que esto solo asegura que lo único que tiene son los números 0-9 para el valor.

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

Puedes añadir otra parte allí para asegurarse, además, de que no se trata de una cierta cantidad de caracteres. Espero que esto ayude.

2

Yo diría que este es el mejor modo

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

como encasillamiento a un int es muy lento.

+2

Pero tenga en cuenta con esta respuesta que si '$ num' es una cadena entera como' $ num = '123'', 'is_int ($ num)' return 'false' – PhoneixS

+0

Uso' is_numeric() ' para verificar si la cadena dada es un número válido – David

0

si {

desuso (preg_match ('/^[0-9] + $ /', $ entrada)!): Function ereg() está en desuso

Cuestiones relacionadas