Ene 212015
 
Artículo PHP

Por defecto, PHP aplica un formato a la hora de imprimir números a standard output o a un fichero, que puede no ser adecuado en algunos casos.

En este artículo veremos qué otras opciones existen en PHP para especificar la representación deseada de un número entero o con decimales.

Para ilustrar este artículo, vamos a utilizar un script de ejemplo que contempla distintos casos que se pueden presentar:

$num1 = 1234;
$num2 = 12345678901234567890;
$num3 = 1234.0;
$num4 = 123456789012345.0;
$num5 = 0.1234;
$num6 = 0.0000001234;
$num7 = 1234.56789;

echo "A: " . $num1 . "\n";
echo "B: " . $num2 . "\n";
echo "C: " . $num3 . "\n";
echo "D: " . $num4 . "\n";
echo "E: " . $num5 . "\n";
echo "F: " . $num6 . "\n";
echo "G: " . $num7 . "\n";

Al ejecutar el script, obtenemos el siguiente resultado:

A: 1234
B: 1.2345678901235E+19
C: 1234
D: 1.2345678901234E+14
E: 0.1234
F: 1.234E-7
G: 1234.56789

Como vemos:

  1. En el primer caso, un número entero pequeño es impreso sin ningún tipo de formato.
  2. En el segundo caso, un número entero muy grande es impreso en notación científica.
  3. Un número en punto flotante es impreso como un número entero si no tiene decimales.
  4. Un número en punto flotante muy grande es impreso en notación científica.
  5. Si el número de decimales no es muy grande, un número en punto flotante es impreso utilizando el punto como separador
  6. Si el número en punto flotante es mucho menor que la unidad, es impreso en notación científica
  7. En los demás casos, un número en punto flotante es impreso utilizando el punto como separador.

Especificar un formato numérico utilizando printf()

La función printf utiliza una especificación de formato que se la pasa como primer argumento, para imprimir el resto de argumentos que recibe. La sintaxis de esta función es:

printf ( string $format [, mixed $args [, mixed $... ]] )

También se puede utilizar la función sprintf(), que utiliza la misma sintaxis. sprintf() devuelve la cadena de texto resultante en lugar de enviarla a standard output.

El formato que recibe printf es una cadena de texto que contiene uno o varios especificadores de formato identificados por el signo % seguido de una letra. Por ejemplo, se puede obtener la representación hexadecimal de un número entero con la sentencia:

$hexadecimal = sprintf("%x",$numero);

 Especificadores de formato para números enteros

  • %x, %X – Generan la representación hexadecimal de un número en minúculas o mayúsculas
  • %b – Genera la representación en binario de un número entero
  • %o – Genera la representación en octal de un número entero
  • %d, %u – Generan la representación en decimal (con signo y sin signo) de un número entero

Ejemplo 1:

Las sentencias:

$num1 = 1234;
printf ("Decimal: %d, Binario: %b, Octal: %o\n",
         $num1, $num1, $num1);
printf ("Hex 1: %x, Hex 2: %4x, Hex 3: %04x\n",
         $num1, $num1, $num1);

Producen como salida:

Decimal: 1234, Binario: 10011010010, Octal: 2322
Hex 1: 4d2, Hex 2:  4d2, Hex 3: 04d2

En ella, podemos apreciar el efecto de utilizar distintas especificaciones de precisión en la salida hexadecimal. En concreto, “%04x” rellena con ceros a la izquierda hasta cuatro dígitos, mientas que “%4x” rellena con blancos a la izquierda.

Ejemplo 2:

Las sentencias:

$num1 = -1234;
printf("Decimal sin signo: %u, Hexadecimal: %X\n",$num1,$num1);

Escriben en pantalla:

Decimal sin signo: 18446744073709550382, Hexadecimal: FFFFFFFFFFFFFB2E

En efecto, dado que hemos ejecutado el ejemplo en un sistema de 64 bit, la representación decimal sin signo de un número negativo N es 2^64 + N, y la representación hexadecimal consta de 16 dígitos, cada uno de los cuales representa cuatro bits.

Especificadores de formato para números de punto flotante

  •  %f, %F – Genera la representación en notación normal de un número de punto flotante. %f y %F permiten especificar el número de decimales que queremos utilizar en la representación del número, de la forma %n.mf, en donde n es el número de dígitos de la parte entera, y m el de la parte decimal.
    Cuando se utiliza %F, el carácter separador de la parte decimal es siempre el punto “.”. Por el contrario, cuando se utiliza %f, el carácter separador utilizado en la representación del número es el correspondiente a la localización (locale) activa, Por ejemplo,  si se utiliza LC_NUMERIC=es_ES, el carácter separador es la coma “,” y no el punto “.”
  • %e, %E – Generan la representación en notación científica de un número de punto flotante, utilizando la letra “e” minúscula o “E” mayúscula respectivamente, para separar la mantisa del exponente.
  • %g, %G – Utiliza notación normal (%f, %F) si el número es pequeño, científica (%e, %E) si es muy grande.

Ejemplo:

Las sentencias:

$num1 = 1234.6789;
setlocale(LC_NUMERIC,"es_ES.UTF8");
printf("En español: %.2f, En inglés: %.2F\n", $num1, $num1);
printf("En notación científica: %.2e con el especificador %%g: %g\n", $num1, $num1);

Generan como salida:

En español: 1234,68, En inglés: 1234.68
En notación científica: 1.23e+3 con el especificador %g: 1234,68

Como vemos, con la función setlocale() establecemos la localización del script en español. El número que se imprime con el especificador “%f” utiliza la coma como separador decimal, mientras que con el especificador “%F” utiliza el punto. También podemos ver que el especificador “%g” utiliza la coma, porque en este caso, al imprimir un número no muy grande, aplica el mismo formato que el especificador “%f”.

Por último, también podemos ver que %f y %F realizan un redondeo cuando se imprimen menos dígitos decimales que los que tiene el número.

Aplicar un separador de miles con number_format()

Para formatear un número incluyendo un caráter separador de miles, en PHP disponemos de la función number_format().

number_format puede ser utilizada con un único parametro, con dos o con cuatro:

string number_format ( float $numero )
string number_format ( float $numero, int $decimales)
string number_format ( float $numero , int $decimales, string $sep_dec, string $sep_miles )

En el primer caso, number_format devuelve la representación de la parte entera del número

En el segundo caso, el segundo argumento establece número de decimales a presentar

Por último, number_format puede ser llamado también especificando explícitamente el carácter a utilizar como separador decimal, y el carácter a utilizar como separador de miles.

Ejemplo:

Las sentencias:

$numero = 1234567.1234567;
echo number_format($numero) . "\n";
echo number_format($numero , 5) . "\n";
echo number_format($numero , 2 , "," , ".") . "\n";

Generan la siguiente salida:

1,234,567
1,234,567.12346
1.234.567,12

La primera llamada a number_format imprime sólamente la parte entera del número, y utiliza la coma como separador de miles.

La segunda llamada imprime hasta cinco decimales. Como se puede ver, se aplica un redondeo.

Por último, en la tercera llamada se utiliza el punto como separador de miles, y la coma como separador decimal.

Referencias

php.net – Función sprintf

php.net – Función number_format

 Publicado por en 1:22 pm

 Deja un comentario

(requerido)

(requerido)