2012-09-29 36 views
13

Duplicar posible:
Check if a variable is a natural number¿Es equivalente PHP a la función parseInt de JavaScript?

acabo de encontrar donde necesito para desinfectar una entrada y eliminar todos los caracteres que no sean dígitos con PHP. Pensé en hacer una función yo mismo, pero primero quería verificar las posibles funciones incorporadas, así no tendré que dedicar más tiempo a reinventar la rueda.

+0

check [php.net/Type Casting] (http://php.net/manual/en/language.types.type-juggling.php) – air4x

+0

¿Por qué no usar intval? – endy

Respuesta

23

Puede utilizar expresiones regulares como a continuación

$int = (int) preg_replace('/\D/', '', $strNonNumeric); 

O

$int = (int) preg_replace('/[^0-9]/', '', $strNonNumeric); 
+0

ah, exactamente lo que quería. Muchas gracias. – think123

+2

@ think123 - vale la pena señalar que (a) esto no produce un int; sigue siendo una cadena, aunque solo contenga dígitos, y (b) la expresión regular es exagerada para este escenario. – Spudley

+1

Es cierto, pero este es uno de los que realmente funciona. Lo editaré de todos modos. – think123

2

Se puede utilizar:

$string = "90"; //string 
$myInt = (int) $string; //parse to int 
+0

Lo siento, pero eso no es exactamente lo que quiero. '(int)' no eliminará todos los caracteres que no sean dígitos, simplemente devolverá '0' si hay caracteres que no sean dígitos dentro de la cadena. – think123

+2

@ think123: El tipo de conversión '(int)' hará lo mismo que 'parseInt()' en javascript. Esto es lo que preguntaste, ¿no es así? –

0

También puede utilizar sscanf (tal como lo hace en C)

<?php 

    $str = "10"; 

    sscanf($str, "%d", $intVal); 
    $intVal *= 10; 

    echo $intVal; 
?> 

Salida:

3

yo recomendaría usar filtro FILTER_VALIDATE_INT.

about Filters on php.net

+0

-1 No coloque un enlace w3schools. Ponga un 'php.net' en su lugar, y le devolveré su voto. – think123

+1

+2 le devolvió su voto, como está garantizado. – think123

+3

Ah, y por algún motivo, por qué: http://www.w3fools.com – think123

19

No hay un equivalente directo a pareseInt() en PHP PHP porque no tiene un tipo de datos NaN. parseInt() producirá NaN si el valor no se puede analizar.

Además, parseInt() tiene el parámetro radix, que ninguna de las opciones de PHP le brinda.

Pero dicho esto, si todo lo que quiere hacer es girar una cadena en un entero, entonces hay varias opciones:

$int = (int)$string; 

$int = intval($string); 

$int = settype($string,'integer'); 

Esos tres todo funcionará de la misma manera. Puede haber algunos casos de borde donde intval() difiere de los otros dos, pero en general, convertirán una cadena en un int. En ausencia de NaN, todos emiten 0 (cero) si la cadena no es numérica y no se puede analizar. Pero esto debería ser suficiente para la mayoría de los propósitos de saneamiento DB.

Si realmente quiere un NaN por error, lo más cerca que obtendrá es null. Usted puede conseguir esto usando filter_var():

$value = filter_var(FALSE, FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE); 

Si lo que desea es comprobar que la cadena es numérico, la función is_numeric() puede hacer eso:

$bool = is_numeric($string); 

Sin embargo, devuelve cierto para los decimales y también para notación científica, por lo que puede no ser perfecto para la mayoría de las situaciones.Una mejor opción es ctype_digit() que devuelve verdadero si la cadena se compone únicamente de dígitos:

$bool = ctype_digit($string); 

Si no E de este trajes, siempre existe la opción de expresiones regulares, utilizando preg_match() o preg_replace(), pero estas son sin duda una exageración para este tipo de escenario

+0

Usar (int) y intval() son muy a prueba de errores, pero tenga en cuenta que si la cadena representa un número de punto flotante (es decir, tiene decimales) , entonces estas funciones simplemente eliminan lo que venga después del punto. Así que "3.999" se convierte en 3. – Wytze

+0

@Wytze: cierto, pero la pregunta era específicamente para eliminar caracteres que no sean dígitos, por lo que la suposición sería que no es un decimal. Hay otras opciones si necesita manejar decimales. – Spudley

Cuestiones relacionadas