Me gustaría crear un gráfico con formato como el que se muestra a continuación:
El recuento de caracteres en cada uno de los campos es de 4, 12, 17, 40 y 4, respectivamente. Los campos también están justificados a la izquierda.
Al utilizar el código que he publicado a continuación, mi resultado se ve así:
Fragmento de código para dar formato a:
for (Tasks examined : shortList) {
String yesNo = examined.isDone() == true ? "yes" : "no";
System.out.printf("%1$-4s" + "| " + "%2$tY.%<tm.%<-12td."
+ "| " + "%3$-17s" + "| " + "%4$-40s" + "| " + yesNo + "\n"
, examined.getNumber(), examined.getDeadline()
, importanceLevel, examined.getName())
}
Los tipos de variables son:
examined.getNumber() //integer
examined.getDeadline() //DateTime
importanceLevel //String
examined.getName() //String
He estudiado la clase de formateador en las JavaDocs aquí . Pero tengo no podía resolver el problema.
El principal problema aquí, es el punto ( . ) Al final del campo 'fecha'. No debe tener todo ese espacio en blanco entre la fecha y el punto final.
Quería organizar el ancho del elemento 'fecha', con la bandera -12, pero que acaba de cortar el resto como el punto final sobre la superficie.
¿Cómo pudo ser resuelto?
Esto podría resolver su problema, si he entendido correctamente sus requisitos:
int index = 1;
//yyyy, MM, dd, hh, min
LocalDateTime ldt = LocalDateTime.of(2018, 12, 31, 12, 10);
//specify custom pattern here
String date = DateTimeFormatter.ofPattern("yyyy.MM.dd.").format(ldt);
String importance = "kozepesen fontos";
String name = "egyik feladat";
String yesNo = "yes";
String formatter = "%-4d| %-12s| %-17s| %-40s| %-5s%n";
//now use System.out.format() to print with pattern specified in 'formatter'
System.out.format(formatter, index, date, importance, name, yesNo);
salida :
1 | 2018.12.31. | kozepesen fontos | egyik feladat | yes
En la solución anterior, convertimos inevitablemente a la fecha en una cadena. Es decir, para que podamos especificar una costumbre patrón para la visualización de la fecha. En primer lugar se crea una
DateTimeFormatter()
instancia, con el patrón deseado. El patrón se especifica con del DateTimeFormatterofPattern(String pattern)
método. Entonces, para obtener una cadena como el tipo de retorno, se utiliza elformat(TemporalAccessor temporal)
método de DateTimeFormatter nuevo. Podemos utilizar la instancia de fecha y hora como elTemporalAccessor
parámetro enformat()
, simplemente, como se muestra en el código de seguridad.Entonces, ¿cómo
String formatter = "%-4d| %-12s| %-17s| %-40s| %5s%n"
el trabajo? He utilizado la sintaxis de la documentación del formateador para Java 8.-
-> El resultado será justificado a la izquierda .%
-> El resultado es un literal .n
-> El resultado es el separador de línea de plataforma específica .d
-> El resultado está formateado como un entero decimal .s
-> Si el argumento arg esnull
, entonces el resultado es "nula". Si argimplements Formattable
, a continuación,arg.formatTo()
se invoca. De lo contrario, el resultado se obtiene mediante la invocaciónarg.toString()
.Por último, los números que he utilizado, especifican la cantidad de caracteres para permitir para cada campo.
Entonces, finalmente, que llamamos
System.out.format
en lugar deprintf()
, donde la cadena de formato, que especifica es el primer parámetro y todas las otras variables en formato debe escribirse en el orden correcto (el mismo orden que el de la cadena de formato, especificando ).