php - mental - Verifica si una variable es un número natural
como mejorar la concentracion y memoria (8)
Quiero hacer un sistema de oferta en un sitio web. Eso significa que los usuarios pueden publicar su oferta (número natural). Quiero asegurarme de que los usuarios no intenten publicar caracteres, números decimales, etc. No quiero usar la función is_numeric porque la notación hexadecimal está permitida. Estaba pensando en usar preg_match para esto. Pero en php.net la documentación para esta función es pequeña y no tengo idea de cómo usar preg_match.
Entonces, ¿cómo debo verificar si una variable es un número natural con preg_match?
Este tipo de depende de su definición de números naturales: de acuerdo con diferentes teorías, el número cero ( 0
) cuenta o no como un número natural.
Para responder a su pregunta sobre cómo resolver esto con preg_match
:
Si quiere incluir cero, usar preg_match es bastante fácil preg_match(''^[0-9]+$'', $input)
.
Uso:
if (preg_match(''^[0-9]+$'', $input))
// $input represents a non-negative numeric value
else
// $input does not represent a non-negative numeric value
Si no desea incluir el cero, use preg_match(''^[1-9][0-9]*$'', $input)
:
if (preg_match(''^[1-9][0-9]*$'', $input))
// $input represents a positive numeric value
else
// $input does not represent a positive numeric value
Dicho eso: para su problema en particular, usar ctype_digit
es una solución más rápida, como ya han señalado otros (tendría que hacer una segunda comprobación si no desea permitir el número cero).
O bien preg_match(''/^[0-9]+$/'', $var);
o ctype_digit
Por lo general, advierto sobre el uso de la expresión regular para analizar los números, ya que generalmente hay mejores soluciones que la expresión regular para esto, pero como usted está pidiendo, trataré de ayudarlo con algo:
preg_match
usa expresiones regulares (regex) para su coincidencia.
Puede encontrar más información sobre la sintaxis de expresiones regulares en sitios como http://www.regular-expressions.info/
Si quiere hacer coincidir un dígito en expresiones regulares, puede usar [0-9]
o /d
.
Si quiere hacer coincidir uno o más elementos, usaría un signo más.
Finalmente, las cadenas de expresiones regulares deben estar encerradas en un par de caracteres. El carácter elegido suele ser un carácter de barra inclinada ( /
), ya que algunos idiomas requieren específicamente este carácter, pero PHP también permite el uso de otros caracteres; tilde ( ~
) es bastante común.
Entonces su cadena de expresiones regulares para hacer coincidir cualquier cantidad de dígitos sería "//d+/"
. Esto se puede poner en una llamada preg_match
como tal:
$isnumeric = preg_match("//d+/",$input_string);
Si tiene requisitos más específicos, puede limitar la cantidad de caracteres permitidos al reemplazar el signo más con {max}
o {min,max}
donde ''min'' y ''max'' son la cantidad de veces que se permite la coincidencia precedente. Entonces, para permitir un número entre dos y seis dígitos de largo, debería usar esto:
$isnumeric = preg_match("//d{2,6}/",$input_string);
Si necesita permitir un punto decimal, necesita saber que el carácter de punto es un carácter especial en expresiones regulares (significa ''emparejar cualquier carácter''), por lo que debe escapar con una barra invertida.
Por lo tanto, una expresión regular para que coincida con una cantidad de moneda con dos decimales, y al menos un dígito antes del punto sería el siguiente:
$isnumeric = preg_match("//d+/./d/d/",$input_string);
Finalmente, tenga en cuenta que la expresión regular devolverá verdadero en todo lo anterior si la cadena simplemente contiene el valor coincidente. Para asegurarse de que no contenga nada más, deberá "anclarlo" al frente y al final de la cadena, utilizando los caracteres de anclaje: ^
para el inicio de la cadena y $
para el final.
Entonces, para el ejemplo anterior, si quiere que solo contenga un número decimal, y nada más, necesitará esto:
$isnumeric = preg_match("/^/d+/./d/d$/",$input_string);
Regex es un tema complejo, pero espero que eso te sirva de inicio.
Si no necesita puntos decimales: ctype_digit
o filter_var($var, FILTER_VALIDATE_INT)
.
Si lo hace: filter_var($var, FILTER_VALIDATE_FLOAT)
.
in_array(str_replace(str_split(''0123456789''), '''', $s), array('','',''.'',''''));
función simple:
function isnature($x){
$y = ceil($x)-floor($x);
return $y == 0 ? true : false;
}
ctype_digit hace lo que quieres:
Comprueba si todos los caracteres en la cadena proporcionada, el texto, son numéricos.
(Antes de PHP 5.1.0, esta función devolvía TRUE cuando el texto era una cadena vacía).
Sé que esto es muy antiguo, pero quería compartir la próxima solución en caso de que alguien más se le ocurra este problema.
Supongo que por número natural te refieres a un número entero positivo (que excluye el número 0).
function is_positive_integer( $value ) {
// Check if is integer and greater than zero
if( is_int( $value ) && $value > 0 ) {
return true;
}
// Is not a positive integer
else {
return false;
}
}