Home | Clases | Programación en PHP | Formato de Strings

Formato de Strings


Introducción

Existen diferentes funciones para dar formato la salida por pantalla de una variable PHP, tanto para números o valores de tipo moneda, comop para fechas o cualquier otro tipo de string.

Muchas de estas funciones dependen de la configuración de localización de nuestro servidor PHP, en concreto, del valor establecido con la función setlocale(), que tiene dos parámetros, uno para el nombre del locale que quiero modificar, y otro para el valor que le quiero dar, por ejemplo:


setlocale(LC_MONETARY, 'es_ES');


cambiará el formato de moneda al tipo español. De este modo, la función setlocale() nos permite modificar los siguientes parámetros:

  • LC_ALL para establecer todas las siguientes
  • LC_COLLATE para la comparación de strings
  • LC_CTYPE para la clasificación y conversión de caracteres
  • LC_MONETARY para datos de moneda
  • LC_NUMERIC para el separador decimal
  • LC_TIME para el formato de fecha y hora
  • LC_MESSAGES para las respuestas del sistema

No obstante, algunas de ellas solo funcionarán si el paquete intl de PHP está instalado y el idioma locale correspondiente también.

Por defecto en PHP, este paquete no se encuentra instalado, de modo que realizaremos todas las funciones de formato sin atender a la localización, y más adelante, cuando instalemos nuestro propio servidor web volveremos sobre esta parte.

Formato de números

Por excelencia, la función que nos permite dar formato a un número es number_format(), que además no tiene en cuenta la configuración de localización comentada anteriormente.

Esta función admite 1, 2 o 4 parámetros (pero no 3):

  • 1 parámetro: el número se redondea al integer más próximo y se usa una coma (,) para separar millares
  • 2 parámetros: el número se redondea al float más próximo con los decimales indicados, usando la coma (,) para separar millares y el punto (.) para los decimales
  • 4 parámetros: el número se redondea al float más próximo con los decimales indicados, usando la el tercer parámetro para separar decimales y el cuarto parámetro para los millares

El siguiente código muestra ejemplos de todos ellos:

echo number_format(10320.666); //muestra 10321
echo number_format(10320.666,2); //muestra 10,320.67
echo number_format(10320.666,2,","," ");//muestra 10 320,67
echo number_format(10320.666,2,".",""); //muestra 10320.67
echo number_format(10320.666,2,",",""); //muestra 10320,67


Formato genérico

La forma más genérica de imprimir por pantalla un string formateado es mediante el uso de la función printf() (o sprintf() para retornar el valor en vez de escribirlo).

En ambos casos, el string de formato está compuesto de cero o más directivas: caracteres ordinarios (excluyendo %) que son copiados directamente al resultado, y especificaciones de conversión, donde cada una de las cuales da lugar a extraer su propio parámetro.

Cada especificación de conversión consiste en un signo de porcentaje (%), seguido por uno o más de estos elementos, en orden:

  • Un especificador de signo opcional que fuerza a usar un signo (- o +) en un número. Por defecto, sólo el signo - se utiliza en un número si es negativo. Esta especificación fuerza números positivos para que también tengan adjunto el signo +.
  • Un especificador de relleno opcional que indica qué carácter se utiliza para rellenar el resultado hasta el tamaño justo del string. Este puede ser un carácter de espacio o un 0 (el carácter cero). El valor por defecto es rellenar con espacios. Un carácter de relleno alternativo se puede especificar prefijándolo con una comilla simple ('). Ver los ejemplos más adelante.
  • Un especificador de alineación opcional que indica si el resultado debe ser alineado a la izquierda o a la derecha. El valor por defecto es justificado a la derecha, un carácter - lo justificará a la izquierda.
  • Un número opcional, un especificador de ancho que indica de cuántos caracteres (mínimo) resultará esta conversión.
  • Un especificador de precisión opcional en la forma de un punto (.) seguido de un string opcional de dígitos decimales que indica cuántos dígitos decimales deben mostrarse para los números de punto flotante. Cuando se utiliza este especificador con un string, actúa como un punto de corte, estableciendo un límite máximo de caracteres al string. Además, el carácter para empleado cuando se rellena un número podría especificarse opcionalmente entre el punto y el dígito.
  • Un especificador de tipo que indica con qué tipo deben ser tratados los datos del argumento. Los tipos posibles son:

    • % - un carácter de porcentaje literal. No se requiere argumento.
    • b - el argumento es tratado como un valor de tipo integer y presentado como un número binario.
    • c - el argumento es tratado como un valor de tipo integer y presentado como el carácter con ese valor ASCII.
    • d - el argumento es tratado como un valor de tipo integer y presentado como un número decimal (con signo).
    • e - el argumento es tratado con notación científica (e.g. 1.2e+2). El especificador de precisión indica el número de dígitos después del punto decimal.
    • E - como %e pero utiliza la letra mayúscula (e.g. 1.2E+2).
    • f - el argumento es tratado como un valor de tipo float y presentado como un número de punto flotante (considerando la configuración regional).
    • F - el argumento es tratado como un valor de tipo float y presentado como un número de punto flotante (no considerando la configuración regional).
    • g - lo mismo que %e y %f.
    • G - lo mismo que %E y %f.
    • o - el argumento es tratado como un valor de tipo integer y presentado como un número octal.
    • s - el argumento es tratado y presentado como un string.
    • u - el argumento es tratado como un valor de tipo integer y presentado como un número decimal sin signo.
    • x - el argumento es tratado como un valor de tipo integer y presentado como un número hexadecimal (con las letras en minúsculas).
    • X - el argumento es tratado como un valor de tipo integer y presentado como un número hexadecimal (con las letras en mayúsculas).

Vamos a analizar algunos de estos especificadores mediante ejemplos con sprintf():


//Intercambio de argumentos
$num = 5;
$ubicacion = 'árbol';

$formato = 'Hay %d monos en el %s';
echo sprintf($formato, $num, $ubicacion); //Devuelve "Hay 5 monos en el árbol"

$formato = 'El %s contiene %d monos';
echo sprintf($formato, $num, $ubicación); //Devuelve "El contiene 0 monos"

$formato = 'El %2$s contiene %1$d monos'; //Devuelve "El árbol contiene 5 monos"
echo sprintf($formato, $num, $ubicacion);

$formato = 'El %2$s contiene %1$d monos. Es un bonito %2$s con %1$d monos.';
echo sprintf($formato, $num, $ubicacion); //Devuelve "El árbol contiene 5 monos. Es un bonito árbol con 5 monos."

//Especificar un carácter de relleno
echo sprintf("%'.9d\n", 123); //Devuelve "......123"
echo sprintf("%'09d\n", 123); //Devuelve "000000123"

//Especificador de posición con otros especificadores
$formato = 'El %2$s contiene %1$04d monos';
echo sprintf($formato, $num, $ubicacion); //Devuleve "El árbol contiene 0005 monos"


A continuación, ejemplos con printf():


$n = 43951789;
$u = -43951789;
$c = 65; // ASCII 65 es 'A'

//Observar el doble %%, esto muestra un carácter '%' literal
printf("%%b = '%b'\n", $n); // representación binaria
printf("%%c = '%c'\n", $c); // muestra el carácter ascii, igual que la función chr()
printf("%%d = '%d'\n", $n); // representación estándar de un entero
printf("%%e = '%e'\n", $n); // notación científica
printf("%%f = '%f'\n", $n); // representación de punto flotante
printf("%%o = '%o'\n", $n); // representación octal
printf("%%s = '%s'\n", $n); // representación en una cadena
printf("%%x = '%x'\n", $n); // representación hexadecimal (minúsculas)
printf("%%X = '%X'\n", $n); // representación hexadecimal (mayúsculas)

printf("%%+d = '%+d'\n", $n); // especificador de signo sobre un entero positivo
printf("%%+d = '%+d'\n", $u); // especificador de signo sobre un entero negativo


El resultado del ejemplo sería:

%b = '10100111101010011010101101'
%c = 'A'
%d = '43951789'
%e = '4.39518e+7'
%f = '43951789.000000'
%o = '247523255'
%s = '43951789'
%x = '29ea6ad'
%X = '29EA6AD'
%+d = '+43951789'
%+d = '-43951789'

Ejemplos de especificadores de string con printf():


$s = 'mono';
$t = 'muchos monos';

printf("[%s]\n", $s); // salida estándar de string
printf("[%010s]\n", $s); // rellenado con ceros también funciona con strings
printf("[%'#10s]\n", $s); // utiliza el carácter de relleno personalizado '#'
printf("[%10.10s]\n", $t); // justificación a la izquierda pero con un corte a los 10 caracteres


El resultado del ejemplo sería:

[mono]
[000000mono]
[######mono]
[muchos mon]

Y para finalizar, 3 ejemplos más con sprintf():


//Fecha ISO rellenando con 0
$anio = 2017;
$mes = 3;
$dia = 4;
$fecha_iso = sprintf("%04d-%02d-%02d", $anio, $mes, $dia);

//Dinero
$dinero1 = 68.75;
$dinero2 = 54.35;
$dinero = $dinero1 + $dinero2; //echo $dinero producirá "123.1"
$formateado = sprintf("%.2f", $dinero); //echo $formateado producirá "123.10"

//Notación científica
$número = 362525200;
echo sprintf("%.3e", $número); // produce 3.625e+8



Ejercicio propuesto

Desarrolla una calculadora básica consistente en 2 campos de entrada de números, un selector tipo radio de operaciones (+, -, * y /) y un selector tipo select (moneda, decimal o científica) que al elegir uno de ellos calcule el resultado y lo formatee según la elección.

Fecha de publicación: 06/09/2019
Asignaturas: desarrollo web en entorno servidor
Temas: php variables bucles arrays
Utilizamos cookies propias y de terceros para mejorar su experiencia en la navegación. Al seguir navegando entendemos que acepta su uso.
Si lo desea, consulte nuestras políticas de privacidad y cookies
ENTENDIDO
[X] Cerrar

Contacta conmigo


[X] Cerrar

Acceso alumnos