2010-12-01 12 views
41

Tengo una lista de precios con una coma para un punto decimal y un punto como el separador de mil.Convertir un número con una coma como punto decimal para flotar

Algunos ejemplos:

12,30
116,10
1.563,14

Estos vienen en este formato de un tercero. Quiero convertirlos en flotadores y agregarlos juntos.

¿Cuál es la mejor manera de hacerlo? number_format parece no funcionar con este formato, y str_replace parece exagerado, ya que tengo que hacerlo más de una vez en cada número.

¿Hay alguna manera mejor? Gracias.

+0

puede exprimir los puntos, luego intercambie la coma por el punto y analice como flotante. Eso es solo 2 reemplazos.Eso no es -terrible- a menos que esté haciendo decenas de miles de registros en una toma – DampeS8N

Respuesta

78

El uso de str_replace() para eliminar los puntos no es exagerado.

$string_number = '1.512.523,55'; 
// NOTE: You don't really have to use floatval() here, it's just to prove that it's a legitimate float value. 
$number = floatval(str_replace(',', '.', str_replace('.', '', $string_number))); 

// At this point, $number is a "natural" float. 
print $number; 
 

Esto es casi seguro que la forma menos intensivo de la CPU se puede hacer esto, y las probabilidades son que incluso si se utiliza una función de lujo para hacerlo, que esto es lo que hace bajo el capó.

+0

'floatval' era la clave aquí ... thx –

+1

o simplemente' $ number = str_replace ([',', '.'], ['.'], $ String_number) * 1.0; ' – Jeff

14

Si está utilizando PHP5.3 o superior, puede usar numfmt_parse para hacer "un número_formato invertido". Si no lo eres, te quedaste con reemplazar las ocurrencias con preg_replace/str_replace.

+1

También necesita PECL intl> = 1.0.0 – riotera

+1

"También necesita PECL intl> = 1.0.0" No, le dice o bien necesita tener PHP 5.3> o necesita instalarlo a través del paquete intl de PECL 1.0.0. PHP 5.3+ tiene el soporte integrado. –

+0

Deberá verificar si la extensión 'intl' está habilitada. No es incorporado, debe compilarse explícitamente o instalarse como una extensión separada. No todos los proveedores de hosting lo instalan con PHP. – cronfy

1

del manual de PHP:

str_replace - Reemplazar todas las ocurrencias de la cadena de búsqueda con la cadena reemplazo

me gustaría ir por ese camino, y luego convertir de cadena a flotar - floatval

4

Suponiendo que están en un archivo o una matriz simplemente la sustitución como un lote (es decir, sobre todo a la vez):

$input = str_replace(array('.', ','), array('', '.'), $input); 

y luego procesar los números de tomar allí el máximo provecho de la naturaleza vagamente escrito de PHP.

2

Esta función es compatible para los números con puntos o comas como decimales

function floatvalue($val){ 
      $val = str_replace(",",".",$val); 
      $val = preg_replace('/\.(?=.*\.)/', '', $val); 
      return floatval($val); 
} 
$number = "1.325.125,54"; 
echo floatvalue($number); // The output is 1325125.54 
$number = "1,325,125.54"; 
echo floatvalue($number); // The output is 1325125.54 
0

puede tener un aspecto excesivo, pero va a convertir cualquier formato dado ningún mater la configuración regional:

function normalizeDecimal($val, int $precision = 4): string 
{ 
    $input = str_replace(' ', '', $val); 
    $number = str_replace(',', '.', $input); 
    if (strpos($number, '.')) { 
     $groups = explode('.', str_replace(',', '.', $number)); 
     $lastGroup = array_pop($groups); 
     $number = implode('', $groups) . '.' . $lastGroup; 
    } 
    return bcadd($number, 0, $precision); 
} 

Salida:

.12   -> 0.1200 
123   -> 123.0000 
123.91  -> 12345678.9100 
123 456 78.91 -> 12345678.9100 
123,456,78.91 -> 12345678.9100 
123.456.78,91 -> 12345678.9100 
123 456 78,91 -> 12345678.9100 
Cuestiones relacionadas