numero - php money format pesos
¿La mejor manera de verificar el entero positivo(PHP)? (20)
Necesito verificar que un valor de entrada de formulario sea un entero positivo (no solo un entero), y noté otro fragmento usando el siguiente código:
$i = $user_input_value;
if (!is_numeric($i) || $i < 1 || $i != round($i)) {
return TRUE;
}
Me preguntaba si hay alguna ventaja al usar los tres controles anteriores, en lugar de hacer algo así:
$i = $user_input_value;
if (!is_int($i) && $i < 1) {
return TRUE;
}
Además de todas las otras respuestas: Probablemente estés buscando ctype_digit
. Busca una cadena que contiene solo dígitos.
Definición:
!A = !is_numeric($i)
B = $i < 1
!C = $i != round($i)
Entonces...
! is_numeric ($ i) || $ i <1 || $ i! = ronda ($ i) es igual a ! A || B || !DO
Asi que:
!A || B || !C = !A || !C || B
Ahora, usando el teorema deMorgan, es decir (! A ||! C) = (A && C), entonces:
!A || !C || B = (A && C) || B
Ahora, tenga en cuenta que A && C = is_numeric ($ i) && $ i == round ($ i), pero si $ i == round ($ i) es TRUE, entonces is_numeric ($ i) también es TRUE, entonces podemos simplificar A && C = C entonces,
(A && C) || B = C || B =
$i == round($i) || $i < 1
Entonces solo necesitas usar:
$i = $user_input_value;
if ($i == round($i) || $i < 1) {
return TRUE;
}
Definitivamente se dirige hacia la tierra de la micro-optimización, pero oye: el código en el que estoy trabajando mastica millones de artículos todos los días y es viernes. Así que hice un poco de experimentación ...
for ($i = 0; $i < 1000000; $i++) {
// Option 1: simple casting/equivalence testing
if ((int) $value == $value && $value > 0) { ... }
// Option 2: using is_int() and ctype_digit(). Note that ctype_digit implicitly rejects negative values!
if ((is_int($value) && $value > 0) || ctype_digit($value)) { ... }
// Option 3: regular expressions
if (preg_match(''/^/d+$/'', $value)) { ... }
}
Luego ejecuté las pruebas anteriores para valores enteros y de cadena
Opción 1: simple prueba de lanzamiento / equivalencia
- Entero: 0,3 s
- Cadena: 0.4s
Opción 2: usar is_int () y ctype_digit ()
- Entero: 0.9s
- Cadena: 1.45s
Opción 3: expresiones regulares
- Entero: 1.83s
- Cadena: 1.60s
Tal vez, como era de esperar, la opción 1 es, con mucho, la más rápida, ya que no hay llamadas a funciones, solo casting. También vale la pena señalar que, a diferencia de los otros métodos, la opción 1 trata el valor de cadena-flotante-entero "5.0" como un entero:
$valList = array(5, ''5'', ''5.0'', -5, ''-5'', ''fred'');
foreach ($valList as $value) {
if ((int) $value == $value && $value > 0) {
print "Yes: " . var_export($value, true) . " is a positive integer/n";
} else {
print "No: " . var_export($value, true) . " is not a positive integer/n";
}
}
Yes: 5 is a positive integer
Yes: ''5'' is a positive integer
Yes: ''5.0'' is a positive integer
No: -5 is not a positive integer
No: ''-5'' is not a positive integer
No: ''fred'' is not a positive integer
Si eso es bueno para su caso de uso particular se deja como un ejercicio para el lector ...
El primer ejemplo es usar round
para verificar que la entrada sea un entero, y no un valor numérico diferente (es decir, un decimal).
is_int devolverá false si pasa una cadena. Vea los ejemplos del manual de PHP para is_int
En lugar de buscar int
O string
con múltiples condiciones como:
if ( ctype_digit($i) || ( is_int($i) && $i > 0 ) )
{
return TRUE;
}
puede simplificar esto simplemente transfiriendo la entrada a (string)
para que la llamada ctype_digit
verifique las entradas de string
e int
:
if( ctype_digit( (string)$i ) )
{
return TRUE;
}
En realidad, no necesita usar las tres comprobaciones y si desea un entero positivo, es posible que desee hacer lo contrario de lo que figura en su código:
if(is_numeric($i) && $i >= 0) { return true; }
Consulte la respuesta de Sören para obtener más información sobre la diferencia entre is_int()
y is_numeric()
Esta es mi solución, espero que sea útil:
if (is_numeric($i) && (intval($i) == floatval($i)) && intval($i) > 0)
echo "positive integer";
Verifico si la cadena es numérica, la segunda comprueba que sea entera y la tercera sea segura
Haría algo como esto:
if ((int) $i > 0) {
// this number is positive
}
El número se convierte en un número positivo o negativo dependiendo del signo menos que está en la parte delantera. Luego, compara el número de tipo de letra a ser mayor que 0 para determinar si el número es positivo.
La mejor forma de verificar números enteros positivos cuando la variable puede ser INTEGER o STRING representando el entero:
if ((is_int($value) || ctype_digit($value)) && (int)$value > 0 ) { // int }
is_int()
devolverá verdadero si el tipo de valor es integer
. ctype_digit()
devolverá true si el tipo es string
pero el valor de la cadena es un entero.
La diferencia entre este control y is_numeric()
es que is_numeric()
devolverá verdadero incluso para los valores que representan números que no son enteros (por ejemplo, "+0.123").
La otra mejor manera de verificar un número entero es usar expresiones regulares. Puede usar el siguiente código para verificar el valor entero. Será falso para los valores de flotación.
if(preg_match(''/^/d+$/'',$i)) {
// valid input.
} else {
// invalid input.
}
Es mejor si también puedes verificar si $ i> 0.
No estoy seguro de por qué no hay ninguna sugerencia para usar filter_var en esto. Sé que es un hilo viejo, pero tal vez ayudará a alguien (después de todo, terminé aquí, ¿verdad?).
$filter_options = array(
''options'' => array( ''min_range'' => 0)
);
if( filter_var( $i, FILTER_VALIDATE_INT, $filter_options ) !== FALSE) {
...
}
También podría agregar un valor máximo también.
$filter_options = array(
''options'' => array( ''min_range'' => 0,
''max_range'' => 100 )
);
Ok, sé que este hilo es muy viejo, pero comparto la opinión de Jeffrey Vdovjak: ya que pude encontrarla, aún podría ayudar a alguien más allá.
php''s gmp_sign () podría ser otra forma fácil de verificar. Funciona para cadenas enteras y numéricas, y devuelve 1 si a es positivo, -1 si a es negativo y 0 si a es cero.
Asi que:
// positive
echo gmp_sign("500") . "/n";
// negative
echo gmp_sign("-500") . "/n";
// zero
echo gmp_sign("0") . "/n";
dará salida:
1
-1
0
Ver el manual de funciones en http://php.net/manual/en/function.gmp-sign.php
PD: Deberá tener habilitado php_gmp.dll en su archivo .ini.
Para verificar el uso de entero positivo:
$i = $user_input_value;
if (is_int($i) && $i > 0) {
return true; //or any other instructions
}
O
$i = $user_input_value;
if (!is_int($i) || $i < 1) {
return false; //or any other instructions
}
Use el que se adapte a su propósito, ya que son lo mismo. Los siguientes ejemplos demuestran la diferencia entre is_numeric()
e is_int()
:
is_numeric(0); // returns true
is_numeric(7); // returns true
is_numeric(-7); // returns true
is_numeric(7.2); // returns true
is_numeric("7"); // returns true
is_numeric("-7"); // returns true
is_numeric("7.2"); // returns true
is_numeric("abc"); // returns false
is_int(0); // returns true
is_int(7); // returns true
is_int(-7); // returns true
is_int(7.2); // returns false
is_int("7"); // returns false
is_int("-7"); // returns false
is_int("7.2"); // returns false
is_int("abc"); // returns false
Si usa "is_int", la variable debe ser entera, por lo que no puede ser un valor flotante. (no se necesita ronda)
Todas estas respuestas pasan por alto el hecho de que el solicitante puede verificar la entrada de la forma.
Is_int () fallará porque la entrada del formulario es una cadena.
is_numeric () será verdadero también para números flotantes.
Es por eso que la $ i == ronda ($ i) entra mientras se verifica que la entrada sea un número entero.
la diferencia entre los dos fragmentos de código es que is_numeric($i)
también devuelve verdadero si $ i es una cadena numérica , pero is_int($i)
solo devuelve verdadero si $ i es un número entero y no si $ i es una cadena entera . Es por eso que debe usar el primer fragmento de código si también desea devolver verdadero si $ i es una cadena entera (por ejemplo, si $ i == "19" y no $ i == 19).
Vea estas referencias para más información:
Laravel 4.2 Regla de validación para número positivo
Solo requiere números positivos, incluidos los valores de flotación.
public static $rules = array(
''field_name'' => ''required|regex:/^/d*/.?/d*$/''
);
Ej .: 20,2,6,06
preg_match(''{^[0-9]*$}'',$string))
y si quieres limitar la duración:
preg_match(''{^[0-9]{1,3}$}'',$string)) //minimum of 1 max of 3
Así que pisitive int con una longitud máxima de 6:
if(preg_match(''{^[0-9]{1,6}$}'',$string)) && $string >= 0)
if(isset($i) && is_int($i) && $i >= 0){ //0 is technically a postive integer I suppose
return TRUE; //or FALSE I think in your case.
}
if(preg_match(''/^[1-9]/d*$/'',$i)) {
//Positive and > 0
}