Extraiga números de coma flotante de una cadena delimitada en PHP

3 minutos de lectura

avatar de usuario
tianbo

Me gustaría convertir una cadena de valores de dimensión delimitados en números flotantes.

Por ejemplo

152.15 x 12.34 x 11mm

en

152.15, 12.34 and 11

y almacenar en una matriz tal que:

$dim[0] = 152.15;
$dim[1] = 12.34;
$dim[2] = 11;

También necesitaría manejar escenarios donde el texto delimitador es diferente y los números pueden ir seguidos de una expresión de unidad como:

152.15x12.34x11 mm

152.15mmx12.34mm x 11mm

avatar de usuario
cleto

$str="152.15 x 12.34 x 11mm";
preg_match_all('!\d+(?:\.\d+)?!', $str, $matches);
$floats = array_map('floatval', $matches[0]);
print_r($floats);

Él (?:...) la construcción de expresiones regulares es lo que se llama grupo que no captura. Lo que eso significa es que el fragmento no se devuelve por separado en parte del $mathces formación. Esto no es estrictamente necesario en este caso pero es una construcción útil saber.

Nota: vocación floatval() sobre los elementos tampoco es estrictamente necesario, ya que PHP generalmente hará malabarismos con los tipos correctamente si intenta usarlos en una operación aritmética o similar. Sin embargo, no duele, particularmente por ser solo una línea.

  • Puedes deshacerte de los paréntesis exteriores y luego $coincide[0] contendrá los partidos. Además, ¿cuál es el propósito de ?: ?

    – troelskn

    3 de junio de 2009 a las 12:22

  • Tienes toda la razón sobre los paréntesis exteriores. Cambié eso. ?: convierte lo que está dentro de esos paréntesis en un grupo que no captura, lo que significa que no se colocará por separado en la matriz $matches en ninguna parte, lo que sucedería si no lo hubiera incluido. No es estrictamente necesario, pero puede ser necesario más limpio y en ejemplos más complicados.

    – cletus

    3 de junio de 2009 a las 12:24

  • @cletus: Tienes toda la razón sobre el paréntesis que no captura, pero hace que la expresión regular sea mucho menos legible en mi opinión. “Obtengo” la expresión regular de Paolo mucho más rápido que la tuya.

    – fusión del alma

    3 de junio de 2009 a las 12:43

  • Bueno, mira el lado positivo: aprendiste algo extra. 🙂 Los grupos que no capturan son útiles.

    – cletus

    3 de junio de 2009 a las 12:44

  • Además, leí el mío y está claro que no estoy interesado en capturar por separado partes del número, solo el número completo. Lo anterior coincide claramente con su intención, que es por lo que debería esforzarse en mi humilde opinión.

    – cletus

    3 de junio de 2009 a las 12:47

  • eso es cierto… corregido. al principio estaba imprimiendo cada valor. si $dim ya tiene algunos valores, usamos un bucle o array_merge()

    – no polaridad

    3 de junio de 2009 a las 12:53

  • Esta respuesta es engañosa. Los valores de la matriz de salida son cadenas, no flotantes.

    – mickmackusa

    hace 15 horas

$string = '152.15 x 12.34 x 11mm';
preg_match_all('/(\d+(\.\d+)?)/', $string, $matches);
print_r($matches[0]); // Array ( [0] => 152.15 [1] => 12.34 [2] => 11 ) 

  • Esta respuesta es engañosa. Los valores de la matriz de salida son cadenas, no flotantes.

    – mickmackusa

    hace 15 horas

avatar de usuario
Ólafur Waage

$str = "152.15 x 12.34 x 11mm";
$str = str_replace("mm", "", $str);
$str = explode("x", $str);
print_r($str); // Array ( [0] => 152.15 [1] => 12.34 [2] => 11 ) 

Lo probé y funciona en todas las cadenas anteriores.

  • Esta respuesta es engañosa. Los valores de la matriz de salida son cadenas, no flotantes.

    – mickmackusa

    hace 15 horas

preg_match_all("/\d*\.?\d+|\d+/", "152.15mmx12.34mm x .11mm", $matches);

Este ejemplo admite números como .11 también, ya que son números válidos. $matches[0] contendrá 152.15, 12.34 y 0.11, dado que escribe el resultado para flotar. si no lo haces 0.11 aparecerá como .11. Escribiría cast usando array_map.

$values = array_map("floatval", $matches[0]); 

Sin embargo, puede usar los valores para cualquier cosa matemática sin escribirlos. solo se necesita fundición cuando se imprimen directamente.

  • Su ejemplo sería más claro si usara los datos de muestra de la pregunta.

    –Toby Allen

    3 de junio de 2009 a las 13:16

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad