Alinee la salida de impresión en Java

Necesito mostrar una lista de artículos con sus precios de una matriz y me gustaría alinear los precios. Casi lo tengo funcionando, pero necesita mejoras. Debajo está el código y la salida. ¿Alguna idea de cómo alinear todos los precios? Hasta ahora, algunos trabajos, pero otros no. Gracias por adelantado.

//for loop System.out.printf("%d. %s \t\t $%.2f\n", i + 1, BOOK_TYPE[i], COST[i]); 

salida:

 1. Newspaper $1.00 2. Paper Back $7.50 3. Hardcover book $10.00 4. Electronic book $2.00 5. Magazine $3.00 

    Puedes probar el siguiente ejemplo. Utilice ‘-‘ antes del ancho para asegurar la sangría izquierda. Por defecto, estarán correctamente sangrados; que puede no adaptarse a su propósito.

     System.out.printf("%2d. %-20s $%.2f%n", i + 1, BOOK_TYPE[i], COST[i]); 

    Sintaxis de cadena de formato: http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax

    Formateo de la salida de impresión numérica: https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

    PD: Esto podría ir como un comentario a la respuesta de DwB, pero todavía no tengo permisos para comentar y así responderlo.

    Las especificaciones de formato para los métodos printf y printf toman un parámetro de ancho opcional.

     System.out.printf( "%10d. %25s $%25.2f\n", i + 1, BOOK_TYPE[i], COST[i] ); 

    Ajuste los anchos a los valores deseados.

    Una solución simple que viene a la mente es tener un bloque de espacios String :

     String indent = " "; // 20 spaces. 

    Cuando imprima una cadena, calcule la sangría real y agréguela al final:

     String output = "Newspaper"; output += indent.substring(0, indent.length - output.length); 

    Esto medirá la cantidad de espacios en la cadena y los colocará a todos en la misma columna.

    Aquí hay una solución potencial que establecerá el ancho de la columna bookType (es decir, el formato del valor bookTypes) en función del valor bookTypes más largo.

     public class Test { public static void main(String[] args) { String[] bookTypes = { "Newspaper", "Paper Back", "Hardcover book", "Electronic book", "Magazine" }; double[] costs = { 1.0, 7.5, 10.0, 2.0, 3.0 }; // Find length of longest bookTypes value. int maxLengthItem = 0; boolean firstValue = true; for (String bookType : bookTypes) { maxLengthItem = (firstValue) ? bookType.length() : Math.max(maxLengthItem, bookType.length()); firstValue = false; } // Display rows of data for (int i = 0; i < bookTypes.length; i++) { // Use %6.2 instead of %.2 so that decimals line up, assuming max // book cost of $999.99. Change 6 to a different number if max cost // is different String format = "%d. %-" + Integer.toString(maxLengthItem) + "s \t\t $%9.2f\n"; System.out.printf(format, i + 1, bookTypes[i], costs[i]); } } } 

    Puede consultar este blog para imprimir texto de color formateado en la consola

    https://javaforqa.wordpress.com/java-print-coloured-table-on-console/

     public class ColourConsoleDemo { /** * * @param args * * "\033[0m BLACK" will colour the whole line * * "\033[37m WHITE\033[0m" will colour only WHITE. * For colour while Opening --> "\033[37m" and closing --> "\033[0m" * * */ public static void main(String[] args) { // TODO code application logic here System.out.println("\033[0m BLACK"); System.out.println("\033[31m RED"); System.out.println("\033[32m GREEN"); System.out.println("\033[33m YELLOW"); System.out.println("\033[34m BLUE"); System.out.println("\033[35m MAGENTA"); System.out.println("\033[36m CYAN"); System.out.println("\033[37m WHITE\033[0m"); //printing the results String leftAlignFormat = "| %-20s | %-7d | %-7d | %-7d |%n"; System.out.format("|---------Test Cases with Steps Summary -------------|%n"); System.out.format("+----------------------+---------+---------+---------+%n"); System.out.format("| Test Cases |Passed |Failed |Skipped |%n"); System.out.format("+----------------------+---------+---------+---------+%n"); String formattedMessage = "TEST_01".trim(); leftAlignFormat = "| %-20s | %-7d | %-7d | %-7d |%n"; System.out.print("\033[31m"); // Open print red System.out.printf(leftAlignFormat, formattedMessage, 2, 1, 0); System.out.print("\033[0m"); // Close print red System.out.format("+----------------------+---------+---------+---------+%n"); }