2013-04-12 18 views
13

Devo visualizzare un elenco di articoli con i relativi prezzi da un array e desidero allineare i prezzi. Ho quasi funzionato, ma ho bisogno di miglioramenti. Di seguito è riportato il codice e l'output. Qualche idea su come allineare tutti i prezzi? Finora alcuni lavori ma altri no. Grazie in anticipo.Allinea l'output printf in Java

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

uscita:

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

http://docs.oracle.com/javase/7/docs/api/java /util/Formatter.html mostra come è possibile allineare l'output. Ad esempio: formatter.format (Locale.FRANCE, "e =% + 10.4f", Math.E); dove 10 è il numero di "spazi" tra il segno di uguale e il numero che viene stampato e 4 è il numero di posizioni decimali. –

risposta

16

Puoi provare l'esempio seguente. Usa '-' prima della larghezza per garantire il rientro sinistro. Di default saranno rientrati di destra; che potrebbe non essere adatto al tuo scopo.

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

Format String Sintassi: http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax

formattazione numerica output di stampa: https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

PS: Questo potrebbe andare come un commento alla risposta di MSF, ma io ancora non dispone delle autorizzazioni per commentare e così rispondendo.

3

Una soluzione semplice che viene in mente è quello di avere un String blocco di spazi:

String indent = "     "; // 20 spaces. 

Quando si stampa una stringa, calcolare il trattino reale e aggiungilo alla fine:

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

In questo modo il numero di spazi della stringa verrà mediato e tutti saranno messi nella stessa colonna.

+0

Vedere risposte come questa mi fa desiderare che Java 'String' abbia' padLeft', 'padRight', ecc. Come le librerie standard di altri linguaggi di programmazione ... – Patashu

+1

Java ha StringUtils.leftPad() e StringUtils.rightPad(). questi fanno parte di Apache Commons Lang. – DwB

6

Le specifiche di formato per printf e i metodi printf accettano un parametro larghezza opzionale.

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

Regolare le larghezze ai valori desiderati.

+8

Prima di tutto, non chiamare qualcuno pigro senza sapere nulla di quella persona. Secondo, sono un principiante di Java ma ho letto di printf e so che% 10d stamperà 10 spazi prima della variabile. Ora Mr. Know-it-all-and-not-pigro, il tuo codice è da nessuna parte vicino a ciò di cui ho bisogno. Se leggi la mia domanda, ho bisogno di aver lasciato l'allineamento, tranne lo spazio dopo il quale la seconda variabile ha bisogno di cambiare (non costante) in modo che anche la terza variabile sia allineata.Grazie comunque. Buona giornata. – user1781482

+1

se avessi letto i documenti printf, sapresti che% 10d specifica una larghezza di campo di 10 e% 010d specifica il campo vuoto a sinistra con larghezza 10. considera la lettura dei documenti. – DwB

+1

leggendo i documenti ti mostrerà che a - come una bandiera verrà a sinistra giustificare il campo. ex% -10d – DwB

1

Ecco una possibile soluzione che imposterà la larghezza della colonna booktype (cioè formato del valore bookTypes) base al valore bookTypes più lunga.

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]); 
     } 
    } 
} 
0

È possibile fare riferimento a questo blog per la stampa di testo colorato formattato su console

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"); 
}