Curso de java. ¿Como presentar números con formato?.
Dando continuidad a la página del curso de java donde empezamos a tratar los objetos envoltorio y la clase number, os traigo una nueva entrega con información relevante sobre el tratamiento de datos numericos.
En ocasiones nos podemos ver necesitados de saber ¿como presentar números con formato?, que los métodos que conocemos hasta ahora, como es el método print y el método println no pueden realizar.
Java pone a nuestra disposición el método printf y el método format (Ambos incluidos en el paquete java.io), para llevar a cabo presentaciones o salidas numéricas en pantalla con el formato apropiado que queramos aplicar. Ambos métodos son idénticos y para usarlos tan solo tenemos que sustituir el método print o println por alguno de los anteriores:
1 2 3 | System.out.format (String cadena, Object... args); System.out.printf (String cadena, Object... args); |
«cadena» indica el formato que se utilizará y «args» las variables a tratar. Con el siguiente ejemplo se entenderá mejor el funcionamiento de ambos métodos;
Ejemplo de uso de métodos printf() y format()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | package formatonumerico; /** * * @author codesitio.com */ public class FormatoNumerico { /** * @param args the command line arguments */ public static void main(String[] args) { int varI = 20; float varf = 2.5f; String varS = "Hola"; System.out.format ("El valor de varI es %d, el de varf es %f" + " y el de varS es %s %n", varI, varf, varS); } } |
Se han incluido dentro de «cadena» aparte de los caracteres que forman cualquier cadena otros caracteres que anteponen el símbolo de tanto por ciento (%) y una letra que señala a que variable hace referencia. Este tipo de indicadores de formato se utiliza mucho en lenguaje c también.
En esta tabla se indican algunos identificadores que nos ayudarán a saber como presentar números con formato:
Indicadores de Formato
Indicador. | Descripción. |
---|---|
%c | Imprime un Caracter. |
%d | Imprime a decimal con signo. Uso con enteros generalmente. |
%f | Imprime con coma flotante. Uso en float. |
%s | Imprime una cadena. Uso con String. |
%u | Imprime un decimal sin signo. uso con enteros. |
%o | Imprime un número octal. Uso con enteros. |
%i | Imprime decimal, uso con enteros. Es igual que %d mostrando la salida, pero entrando datos con scanf difiere de %d, ya que se pueden especificar valores octales y hexadecimales. |
%x | imprime hexadecimal sin signo. |
%p | válido para punteros. |
%n | Nueva linea. |
%% | Imprime el carácter %. |
Si necesitáis echar mano de mas especificadores o convertidores de formato en esta página de oracle hay extensa información.
Ejemplo de salidas númericas con formato usando el método printf().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | package formatonumerico2; /** * * @author codesitio.com */ public class FormatoNumerico2 { public static void main(String[] args) { double num = 999.235; System.out.printf (num +" = %.3f %n", num); System.out.printf (num +" = %.2f %n", num); System.out.printf (num +" = %.1f %n", num); System.out.printf (num +" = %09.4f %n", num); System.out.printf (num +" = %7.1e h%n", num); System.out.printf (num +" = %7.3e %n", num); System.out.printf (num +" = %7.2e %n", num); System.out.printf (num +" = %5.2e %n", num); System.out.printf ("PI = %4.2f, e = %6.4f %n", Math.PI, Math.E); } } |
Este programa presentará en consola los siguientes resultados:
La clase NumberFormat.
La clase NumberFormat viene incluida en el paquete java.text y sirve para dar formato de salida a números pudiendo especificar localidades o países diferentes, así como el lenguaje a tratar.
Crear un objeto de la clase NumberFormat para una determinada localidad.
Para especificar una determinada localidad y presentar salidas con formato conforme a dicha localidad, tenemos que crear un objeto de la clase Local incluida en el paquete java.util y otro objeto de la clase NumberFormat:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package numberformato; import java.text.NumberFormat; import java.util.Locale; /** * * @author codesitio.com */ public class Numberformato { public static void main(String[] args) { //Localidad: Inglaterra Locale locale = new Locale ("en", "UK"); NumberFormat objNF = NumberFormat.getInstance (locale); String cadena= objNF.format(999999.99); System.out.println("INGLATERRA"); System.out.println("----------"); System.out.println(cadena); //Localidad: España Locale locale2 = new Locale ("es", "ES"); NumberFormat objNF2 = NumberFormat.getInstance (locale2); String cadena2= objNF2.format(999999.99); System.out.println(); System.out.println("ESPAÑA"); System.out.println("----------"); System.out.println(cadena2); } } |
El constructor de la clase Local puede no tener parámetros, tener solo la denominación del país o como en el ejemplo incluir el lenguaje y la denominación del país como parámetros.
Se puede comprobar que es muy sencillo usar esta clase. El resultado en consola del programa anterior seria:
Como podemos apreciar España e Inglaterra utilizan distintas formas de separar los miles y decimales. En este enlace podeis acceder a una lista bastante completa de las abrievaturas ISO utilizadas para cada lenguaje y la siguiente imagen detalla la abreviatura de los paises:
La clase DecimalFormat.
la clase decimalFormat del paquete java.text ofrece métodos que ayudan a dar formato si este consiste en agregar ceros ya sea al principio o al final, introducir separadores de miles (signo «coma») y decimal (signo «punto»).
Aquí hay un programa de ejemplo que ilustra el uso de la clase DecimalFormat:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package decimalformato; import java.text.*; /** * * @author codesitio.com */ public class DecimalFormato { static public void main(String[] args) { //Patrón que da formato a la salida String patron = "###, ###. ##"; //Creamos un objeto DecimalFormat DecimalFormat objDF = new DecimalFormat (patron); //le añadimos el número que queremos presentar con formato String cadena = objDF.format (9999999.99); //Lo presentamos en pantalla System.out.println (cadena); } } |
Este código anterior dará el siguiente resultado en consola:
Cada símbolo «#» representa un dígito, el punto «.» separa en decimales y la coma «,» en miles conforme a nuestra configuración local. Luego veremos que podemos cambiar dicha configuración y el tipo de separador.
También podemos crear un método cuando necesitemos presentar varios números con distintos formatos de salida. Este ejemplo abarca distintos formatos de salida utilizando un método:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package decimalformato2; import java.text.*; /** * * @author codesitio.com */ public class DecimalFormato2 { public static void metodoForm (int num, String patron, double dato) { DecimalFormat objDF = new DecimalFormat (patron); String result = objDF.format (dato); System.out.println ("Dato "+num+": ("+dato+ ") Patron: (" +patron+ ") Salida: " +result); } public static void main (String [] args) { metodoForm (1,"###, ###. ###", 99999.999); System.out.println (); metodoForm (2,"###. ##", 99999.999); System.out.println (); metodoForm (3,"000000.000", 9999.99); System.out.println (); metodoForm (4,"$ ###, ###. ###", 99999.999); System.out.println (); } } |
En consola obtenemos los siguientes resultados:
Dato 1 muestra el ejemplo visto anteriormente, donde la almohadilla representa un dígito. En Dato 2 hemos suprimido almohadillas tanto en la parte de miles como en decimales donde solo tenemos dos almohadillas. Al suprimir una almohadilla en la parte decimal no podemos representar los tres decimales y java redondea el resultado.
En Dato 3 vemos que se han incluido ceros (0) en el patrón. El cero actúa como la almohadilla, es decir representa a un dígito, pero si en el número no hay dígito en una posición el cero ocupa dicha posición. En este caso vemos que se añaden dos ceros a la izquierda (parte de miles) porque en patrón hay (6 ceros) y el dato tiene solo (4 dígitos). y en la parte decimal se añade un cero porque el patrón tiene (3 ceros) y el dato (2 dígitos).
En Dato 4 vemos que podemos incluir cualquier símbolo (Excepto comillas, lógicamente) delante de la primera almohadilla que tengamos en el patrón y este se presentará en pantalla.
Hasta aqui llega esta página, donde hemos visto distintas maneras de presentar números con formato por consola. Espero esta información sea de utilidad y como siempre digo os animo a comentar cualquier duda que os pueda surgir.