2011-03-29 14 views
30

Sé que esto podría sonar como una pregunta ficticia, pero estoy tratando de asegurar que la cadena proporcionada sea de un formato numérico/decimal para usarla más adelante con la función num_formato() de PHP.expresión regular de PHP - número de filtro solamente

Cómo lo haría - digamos que alguien está escribiendo 15:00 en el campo de texto - qué expresión regular y función php debo usar para eliminar los dos puntos y hacer que solo devuelva los caracteres válidos.

preg_match() devuelve una matriz, por lo que no puedo pasar el resultado a number_format() a menos que implode() o algo así.

Su ayuda sería muy apreciada.

+0

'123.4.5 o 123: 4 \ 5 o abs: 4: 5' -> ¿Qué cifra quieres en el resultado? –

Respuesta

92

Usando is_numeric o intval es probablemente la mejor manera de validar un número aquí, pero para responder a su pregunta que podría tratar de usar preg_replace lugar. En este ejemplo se elimina todos los caracteres no numéricos:

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

¿Qué pasa con un punto decimal? ¿Podemos incluirlo como opcional? – user398341

+5

Solo ponga un "." dentro de los '[corchetes]'. P.ej. ''/ [^. 0-9] /' '- tenga en cuenta que si está fuera de los corchetes se convertirá en un comodín. Y esto cubrirá el 90% de su caso de uso, pero también permitirá cualquier orden para casos extremos como "123". y ".123" funcionará. Una buena idea es probar tus expresiones regulares contra ejemplos que sabes que deberían o no deberían fallar. Un sitio como [este] (http://www.gskinner.com/RegExr/) funciona muy bien. – buley

+0

¡Además del sitio web citado por @buley, otro muy bueno es https://regex101.com! – slinstj

36

Para eliminar todo lo que no es un número:

$output = preg_replace('/[^0-9]/', '', $input); 

Explicación:

  • [0-9] coincide con cualquier número entre 0 y 9 inclusive.
  • ^ niega un patrón [].
  • Por lo tanto, [^0-9] coincide con cualquier cosa que no sea un número, y ya que estamos usando preg_replace, serán reemplazados por nada '' (segundo argumento de preg_replace).
+1

Buena explicación ;-) – serfer2

2

uso construido en función de php is_numeric para comprobar si el valor es numérico.

+1

Estoy usando is_numeric - pero esto solo devuelve booleano - así que si no lo es me quedé sin valor El problema al que me enfrento aquí es que durante la prueba de la aplicación alguien ha tecleado los dos puntos (:) en lugar del punto (.) Como separador decimal, y esto ha causado un error con number_format() – user398341

+1

123.4.5 -> qué dígito ¿estarán? –

6

Puede probar que uno:

$string = preg_replace('/[^0-9]/', '', $string); 

Saludos.

0

Puede hacer algo como esto si solo desea números enteros.

function make_whole($v){ 
    $v = floor($v); 
    if(is_numeric($v)){ 
     echo (int)$v; 
     // if you want only positive whole numbers 
     //echo (int)$v = abs($v); 
    } 
} 
Cuestiones relacionadas