Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Littl3 en 14 Octubre 2010, 10:09 am



Título: number_format() y numeros enteros (Solucionado)
Publicado por: Littl3 en 14 Octubre 2010, 10:09 am
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.


Título: Re: number_format() y numeros enteros
Publicado por: xassiz~ en 14 Octubre 2010, 14:39 pm
is_float() (http://www.php.net/manual/es/function.is-float.php)


Título: Re: number_format() y numeros enteros
Publicado por: ~ Yoya ~ en 14 Octubre 2010, 15:25 pm
Ejemplo:

Código
  1. <?php
  2.  
  3. $numeros = array(1234.56, 50000, 1258.364, 10000221, 3000.24);
  4.  
  5. foreach($numeros as $numeros){
  6. $result = is_int($numeros) ? number_format($numeros) : (number_format($numeros, 4, ',', '.'));
  7. echo "$result<br />";
  8. }
  9.  
  10. ?>
  11.  

Salida:
Código:
1.234,5600
50,000
1.258,3640
10,000,221
3.000,2400


Título: Re: number_format() y numeros enteros
Publicado por: Littl3 en 14 Octubre 2010, 15:33 pm
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.


Título: Re: number_format() y numeros enteros
Publicado por: ~ Yoya ~ en 14 Octubre 2010, 15:39 pm
puedes poner un ejemplo de como quieres que salga...


Título: Re: number_format() y numeros enteros
Publicado por: Littl3 en 14 Octubre 2010, 16:08 pm
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


Código:
number_format($resultado, 4, ',', '.')


Título: Re: number_format() y numeros enteros
Publicado por: ~ Yoya ~ en 14 Octubre 2010, 16:38 pm
Cree una función para hacer esto, solo había que hacer algunos cambios.

Funcion:
Código
  1. <?php
  2. function format($num)
  3. {
  4.   if(is_int($num))
  5.   {
  6.      $number = number_format($num);
  7.      $number = preg_replace('/\,/','.',$number);
  8.      return $number;
  9.   }
  10.   else{
  11.           $num = preg_replace('/\,/','.',$num);
  12.           $result =  number_format($num, 4, ',', '.');
  13.  
  14.           $result = preg_replace('/0*$/','',$result);
  15.           return $result;
  16.  
  17.        }
  18. }
  19.  
  20. ?>

Ejemplo:

Código
  1. <?php
  2.  
  3. function format($num)
  4. {
  5.   if(is_int($num))
  6.   {
  7.      $number = number_format($num);
  8.      $number = preg_replace('/\,/','.',$number);
  9.      return $number;
  10.   }
  11.   else{
  12.           $num = preg_replace('/\,/','.',$num);
  13.           $result =  number_format($num, 4, ',', '.');
  14.  
  15.           $result = preg_replace('/0*$/','',$result);
  16.           return $result;
  17.  
  18.        }
  19. }
  20.  
  21. $numeros = array('4244,394144', 4244, '3455,540', '4322,1000');
  22.  
  23. foreach($numeros as $numeros){
  24. echo "$numeros --> ".format($numeros)."<br />";
  25. }
  26.  
  27. ?>
  28.  
  29.  

Salida:
Código:
4244,394144 --> 4.244,3941
4244 --> 4.244
3455,540 --> 3.455,54
4322,1000 --> 4.322,1


Título: Re: number_format() y numeros enteros
Publicado por: Littl3 en 14 Octubre 2010, 17:16 pm
Muchas gracias Yoya pero acabo de terminar mi función con cuatro líneas,  la adjunto por si a alguien le sirve.

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


Título: Re: number_format() y numeros enteros (Solucionado)
Publicado por: ~ Yoya ~ en 14 Octubre 2010, 17:25 pm
Error...

Código
  1. <?php
  2.  
  3. function number_format_sin_zeros($valor)
  4. {
  5. $decimales = strlen(strrchr($valor, "."))-1; //Cuento posiciones decimales
  6. if($decimales == -1){$decimales=0;} //Si no existe el punto, decimales = 0
  7. if($decimales > 4){$decimales = 4;} //Si la cifra tiene mas de 4 decimales muestro solo 4
  8. return number_format($valor, $decimales, ',', '.'); //El numero de decimales
  9. }
  10.  
  11. $numeros = array('4244,394144', 4244, '3455,540', '4322,1000');
  12.  
  13. foreach($numeros as $numeros){
  14. echo "$numeros --> ".number_format_sin_zeros($numeros)."<br />";
  15. }
  16.  
  17. ?>
Código:
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


Título: Re: number_format() y numeros enteros (Solucionado)
Publicado por: Littl3 en 14 Octubre 2010, 17:32 pm
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.


Título: Re: number_format() y numeros enteros (Solucionado)
Publicado por: ~ Yoya ~ en 14 Octubre 2010, 17:34 pm
Sip, tenia el mismo problema por eso implemente  preg_replace('/\,/','.' xD.

No pasa nada...

Saludos.