12 Escritura en pantalla¶
Introducción¶
La salida por pantalla en Java se hace con el objeto System.out. Este objeto es una instancia de la clase PrintStream del paquete java.lang. Si miramos la API de PrintStream obtendremos la variedad de métodos para mostrar datos por pantalla, algunos de estos son:
- print y println: muestran los datos por pantalla. Están sobrecargados para varios tipos de datos. El println inserta un salto de línea después de mostrar el dato.
- printf: escribe una cadena de texto utilizando formato.
En print y println, cuando queramos escribir un mensaje y el valor de una variable debemos utilizar el operador de concatenación
de cadenas (+), por ejemplo:
Escribe el mensaje de "Bienvenido, Carlos", si el valor de la variable nombre es Carlos. En print y println, todas las variables que se muestran se consideran como cadenas de texto sin formato,por ejemplo, no sería posible indicar que escriba un número decimal con dos cifras decimales.
Para ello se utiliza printf
Ejercicio 1
Muestra en consola lo siguiente, exactamente igual, utilizando System.out.print
El método printf¶
printf(String format, Object... args)
En String format
se coloca la cadena a la cual se le quiere dar formato. Utiliza unos códigos de conversión para indicar del contenido a mostrar de qué tipo es. Estos códigos se caracterizan porque llevan delante el símbolo %
, algunos de ellos son:
%c
: carácter.%s
: cadena de texto.%d
: entero.%f
: número decimal.
También se pueden usar las secuencias de escape que van precedidas de \
, como por ejemplo \n
y \t
, incluso el salto de línea \n
también se puede especificar como %n
.
En Object... args
se colocan los valores correspondientes. El primero corresponde al primer %, el segundo al segundo, y así sucesivamente. Dichos valores tienen que ser expresiones que devuelvan resultados con tipos compatibles a los % que correspondan.
Ejemplos:
Nos mostraría por pantalla: El carácter es a
Salida por pantalla: 10
Si queremos mostrar el símbolo % se utiliza otro % delante:
Salida por pantalla: El 20% de 200 es 40
Decimales¶
Para %f
podemos especificar el número de decimales escribiendo .n
entre % y f, siendo n el número de decimales:
La salida por pantalla es 12,37
ya que se realiza un redondeo para mostrar los decimales indicados.
Números con signo¶
Para mostrar números con signo se utiliza el símbolo + entre % y d si es un número entero o entre % y f si es un número decimal.
Salida por pantalla: +10
Salida por pantalla: -10
Salida por pantalla: +3.97
Salida por pantalla: -3.968000
Mostrar más de un valor¶
Utilizaremos tantos % como valores vamos a formatear. Después de la primera coma, se van poniendo los valores separados por comas, el primero corresponde al primer %, el segundo al segundo %, y así sucesivamente.
double decimal = 1.25036;
int integer = 10;
System.out.printf("decimal = %.2f integer = %d", decimal, integer);
Salida por pantalla: decimal = 1,25 integer = 10
También podemos cambiar el orden por defecto de correspondencia entre los valores y los % con el símbolo $
. Ejemplo: %2$d
significa que al número entero (%d) se le va a asignar el segundo valor (2$
).
Salida por pantalla: decimal1 = 1,25 integer = 10 decimal2 = +1,3
Ejemplo: mostrar el números 123.4567 y su cuadrado ambos con dos decimales:
double decimal = 123.4567;
System.out.printf("El cuadrado de %.2f es %.2f", decimal, decimal * decimal)
Salida por pantalla: El cuadrado de 123,46 es 15241,56
Especificar un ancho de campo¶
printf permite también mostrar valores con un ancho de campo determinado. Por ejemplo, si queremos mostrar un número entero en un ancho de 10 caracteres, escribimos 10 enter % y d:
Otro ejemplo con números decimales: mostrar con dos decimales, con signo y en un ancho de campo de 10 caracteres:
En el ancho de 10 caracteres, se cuentan además de las cifras del número, la coma decimal, el signo si lo lleva. En este caso, el número ocupa un espacio de 5 caracteres (3 cifras, la coma y el signo), por lo tanto, se añaden 5 espacios en blanco al principio para completar el tamaño de 10.
Para completar el ancho de caracteres con ceros en lugar de con espacios, se coloca un 0 delante del ancho de caracteres:
Veamos un ejemplo con cadenas: mostrar la cadena "Manolo" con un ancho de 10 caracteres:
Alineación a la izquierda¶
Con el signo -
se indica alineación a la izquierda.
Ejemplo: mostrar un decimal con un ancho de 9 caracteres, con tres decimales y alineado a la izquierda:
Ejemplo con cadenas: mostrar la cadena "Manolo" con un ancho de 10 caracteres y alineada a la izquierda:
Ejemplos¶
He aquí todos los ejemplos de printf vistos en este apartado:
public class Printf {
public static void main(String[] args) {
double decimal;
int integer;
System.out.printf("El carácter es %c%n", 'a');
integer = 10;
System.out.printf("%d\n", integer);
System.out.printf("El 20%% de %d es %d\n", 200, 200 * 20 / 100);
System.out.printf("%.2f\n", 12.3698);
decimal = 1.25036;
System.out.printf("%.3f\n", decimal);
System.out.printf("%+d\n", integer);
integer = -10;
System.out.printf("%+d\n", integer);
decimal = 3.968;
System.out.printf("%+.2f\n", decimal);
decimal = -3.968;
System.out.printf("%+f\n", decimal);
decimal = 1.25036;
integer = 10;
System.out.printf("decimal = %.2f integer = %d\n", decimal, integer);
System.out.printf("decimal1 = %2$.2f integer = %1$d decimal2 = %2$+.1f\n", integer, decimal);
decimal = 123.4567;
System.out.printf("El cuadrado de %.2f es %.2f\n", decimal, decimal * decimal);
integer = 1234;
System.out.printf("Ancho de 10 caracteres con un entero:%10d\n", integer);
decimal = 1.25036;
System.out.printf("Ancho de 10 caracteres con un decimal:%+10.2f\n", decimal);
decimal = 1.25036;
System.out.printf("Ancho de caracteres rellenado con ceros:%+010.2f\n", decimal);
System.out.printf("Ancho de caracteres con cadenas:%10s\n", "Manolo");
decimal = 58.965874f;
System.out.printf("decimal=%-9.3fQue ocupe 9 caracteres, con tres decimales y alineado a la izquierda\n", decimal);
System.out.printf("%-10s:Alineación a la izquierda con cadenas\n", "Manolo");
}
}
Ejemplo de Scanner y printf¶
He aquí un ejemplo de entrada/salida de datos utilizando Scanner y printf.
import java.util.Scanner;
public class InputOutput {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
String name;
int age;
float salary;
// Entrada de datos
System.out.print("Nombre: ");
name = keyboard.nextLine();
System.out.print("Edad: ");
age = keyboard.nextInt();
System.out.print("Salario: ");
salary = keyboard.nextFloat();
// Salida de datos
System.out.printf("\nBienvenido: %s\n", name);
System.out.printf("Tienes: %d años\n", age);
System.out.printf("Tu salario es: %.2f euros\n", salary);
}
}
Ejercicio 2
Utilizando las siguientes variables:
Muestra en consola el siguiente resultado, exactamente igual, utilizando System.out.printf
, sin utilizar espacios ni tabulaciones en la cadena de formato y utilizando solamente las variables indicadas anteriormente.
Colores¶
Para poder utilizar colores en la escritura de datos por pantalla, hay que comprobar si es necesario instalar algún plugin en el IDE.
Las secuencias de escape ANSI permiten enviar información de control a la consola para cambiar los atributos del texto representado. Solo debemos anteponer a la cadena que queremos mostrar en color el código de escape ANSI referente al color.
Cuando aplicamos un color a la salida por consola, el resto de salida por consola seguirá saliendo de dicho color hasta que se especifique otro color de salida o finalicemos el texto con el código RESET, en cuyo caso se vuelve al color por defecto.
public class Colors {
public static final String RESET = "\u001B[0m";
public static final String BLACK = "\u001B[30m";
public static final String RED = "\u001B[31m";
public static final String GREEN = "\u001B[32m";
public static final String YELLOW = "\u001B[33m";
public static final String BLUE = "\u001B[34m";
public static final String PURPLE = "\u001B[35m";
public static final String CYAN = "\u001B[36m";
public static final String WHITE = "\u001B[37m";
public static final String BLACK_BACKGROUND = "\u001B[40m";
public static final String RED_BACKGROUND = "\u001B[41m";
public static final String GREEN_BACKGROUND = "\u001B[42m";
public static final String YELLOW_BACKGROUND = "\u001B[43m";
public static final String BLUE_BACKGROUND = "\u001B[44m";
public static final String PURPLE_BACKGROUND = "\u001B[45m";
public static final String CYAN_BACKGROUND = "\u001B[46m";
public static final String WHITE_BACKGROUND = "\u001B[47m";
public static final String BOLD = "\u001B[1m";// Negrita
public static final String UNDERLINE = "\u001B[4m";// Subrayado
public static final String REVERSED = "\u001B[7m";// Invierte los colores del texto y del fondo
}
import static examples.tema_01.Colors.*;
public class ColorUse {
public static void main(String[] args) {
System.out.println(RED + "Este texto es de color rojo" + RESET);
System.out.println("Volvemos al color por defecto");
System.out.println(GREEN + "...y ahora es verde");
System.out.println(PURPLE_BACKGROUND + "Fondo morado");
System.out.println(CYAN + WHITE_BACKGROUND + "Fondo blanco con texto celeste");
System.out.println(CYAN + WHITE_BACKGROUND + BOLD + "Fondo blanco con texto celeste en negrita");
System.out.println(CYAN + WHITE_BACKGROUND + UNDERLINE + "Fondo blanco con texto celeste subrayado");
System.out.printf("%s\n", YELLOW + RED_BACKGROUND + (char) 9733); //Estrella
System.out.println(YELLOW + GREEN_BACKGROUND + "Fondo verde con texto amarillo");
System.out.println(REVERSED + "Fondo amarillo con texto verde usando REVERSED");
}
}
Ejercicio 3
Muestra en consola una línea de texto con 3 colores y fondos diferentes usando solamente un printf.