number_format() y numeros enteros (Solucionado)

Iniciado por Littl3, 14 Octubre 2010, 10:09 AM

0 Miembros y 1 Visitante están viendo este tema.

Littl3

Hola,

Tengo un problema a la hora de mostrar un resultado numerico, quiero mostrar $resultado usando number_format para añadir un . como separador de miles y una , para los decimales, hasta aqui todo bien, ahora bien al usar number format tienes que indicar cuantos decimales quieres mostrar, yo le indico que 4 pero claro si se trata de un numero entero me muestra... 1234,0000 ...  Claro me saca 4 decimales a 0 totalmente inutiles, yo lo que quiero es que si es un entero no me muestre decimales y si tiene decimales como maximo que me muestre 4.

echo number_format($resultado, 4, ',', '.');

Gracias, un saludo.


~ Yoya ~

#2
Ejemplo:

Código (php) [Seleccionar]
<?php

$numeros 
= array(1234.56500001258.364100002213000.24);

foreach(
$numeros as $numeros){
$result is_int($numeros) ? number_format($numeros) : (number_format($numeros4',''.'));
echo 
"$result<br />";
}

?>



Salida:
1.234,5600
50,000
1.258,3640
10,000,221
3.000,2400
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Littl3

Gracias pablomi pero el is_float solo me sirve para saber si se trata de un numero entero.

Yoya tu codigo me puede ayudar aun así no es exactamente lo que necesito, en tu caso si uno de los numeros contiene un solo decimal, le añade 3 zeros a la derecha tal y como le indicas en el number float.

La idea es poder formatear la salida del numero añadiendo separador de miles y separador de decimales y permitir un maximo de 4 decimales, seguire buscando si encuentro la solución la posteo, un saludo.

~ Yoya ~

puedes poner un ejemplo de como quieres que salga...
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Littl3

Por supuesto,

Se trata de limitar a 4 el maximo de decimales permitidos, no obstante si el numero es entero o solo tiene una o dos posciones decimales no necesito que la tercera y la cuarta posición se rellenen con 0, a esto hay que añadir el '.' como separador de miles y la ',' como separador de decimales.

Para limitar a 4 el maximo de decimales permitidos se puede hacer con round pero si lugo quiero añadirle el separador de miles y decimales del maravilloso number_format tengo que indicarle a este cuantos decimales quiero y la función rellena las posiciones con zeros de forma obligada en caso de que no exista el decimal.

Pongo unos ejemplos de como quiero el formateo, creo que no me voy a librar de hacer una función especifica para esto, un saludo.


  • 4244,394144 --> 4.244,3941
  • 4244 --> 4.244
  • 3455,540 --> 3.455,54
  • 4322,1000 --> 4.322,1


number_format($resultado, 4, ',', '.')

~ Yoya ~

#6
Cree una función para hacer esto, solo había que hacer algunos cambios.

Funcion:
Código (php) [Seleccionar]

<?php
function format($num)
{
   if(
is_int($num))
   {
      
$number number_format($num);
      
$number preg_replace('/\,/','.',$number);
      return 
$number;
   }
   else{
           
$num preg_replace('/\,/','.',$num);
           
$result =  number_format($num4',''.');

           
$result preg_replace('/0*$/','',$result);
           return 
$result;

        }
}

?>


Ejemplo:

Código (php) [Seleccionar]
<?php

function format($num)
{
   if(
is_int($num))
   {
      
$number number_format($num);
      
$number preg_replace('/\,/','.',$number);
      return 
$number;
   }
   else{
           
$num preg_replace('/\,/','.',$num);
           
$result =  number_format($num4',''.');

           
$result preg_replace('/0*$/','',$result);
           return 
$result;

        }
}

$numeros = array('4244,394144'4244'3455,540''4322,1000');

foreach(
$numeros as $numeros){
echo 
"$numeros --> ".format($numeros)."<br />";
}

?>




Salida:
4244,394144 --> 4.244,3941
4244 --> 4.244
3455,540 --> 3.455,54
4322,1000 --> 4.322,1
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Littl3

Muchas gracias Yoya pero acabo de terminar mi función con cuatro líneas,  la adjunto por si a alguien le sirve.

Código (php) [Seleccionar]

<php
function number_format_sin_zeros($valor)
{
$decimales = strlen(strrchr($valor, "."))-1; //Cuento posiciones decimales
if($decimales == -1){$decimales=0;} //Si no existe el punto, decimales = 0
if($decimales > 4){$decimales = 4;} //Si la cifra tiene mas de 4 decimales muestro solo 4
return number_format($valor, $decimales, ',', '.'); //El numero de decimales
}
?>

~ Yoya ~

Error...

Código (php) [Seleccionar]
<?php

function number_format_sin_zeros($valor)
{
$decimales strlen(strrchr($valor"."))-1//Cuento posiciones decimales
if($decimales == -1){$decimales=0;} //Si no existe el punto, decimales = 0
if($decimales 4){$decimales 4;} //Si la cifra tiene mas de 4 decimales muestro solo 4
return number_format($valor$decimales',''.'); //El numero de decimales 
}

$numeros = array('4244,394144'4244'3455,540''4322,1000');

foreach(
$numeros as $numeros){
echo 
"$numeros --> ".number_format_sin_zeros($numeros)."<br />";
}

?>


Notice: A non well formed numeric value encountered in /var/www/html/pruebas.php on line 8 4244,394144 --> 4.244
4244 --> 4.244
Notice: A non well formed numeric value encountered in /var/www/html/pruebas.php on line 8 3455,540 --> 3.455
Notice: A non well formed numeric value encountered in /var/www/html/pruebas.php on line 8 4322,1000 --> 4.322
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Littl3

Eso es porque en php se utiliza el punto por defecto para el separador de decimales en vez de la coma, ademas la funcion funciona a la perfeccion trabajando con valores numericos y no con strings.

Prueba esto:

$numeros = array(4244.394144, 4244, 3455.540, 4322.1000);

Un saludo y gracias por el interés.