2013-04-12 14 views
13

Potrzebuję wyświetlić listę przedmiotów z ich cenami z tablicy i chciałbym wyrównać ceny. Mam prawie to działa, ale wymaga ulepszeń. Poniżej znajduje się kod i dane wyjściowe. Jakieś pomysły, jak dostosować wszystkie ceny? Do tej pory niektóre prace, ale niektóre nie. Z góry dziękuję.Wyrównaj printf output w Javie

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

wyjściowa:

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 pokazuje, jak wyrównać dane wyjściowe. Na przykład: formatter.format (Locale.FRANCE, "e =% + 10.4f", Math.E); gdzie 10 to liczba "spacji" między znakiem równości a liczbą drukowaną, a 4 to liczba miejsc dziesiętnych. –

Odpowiedz

16

Możesz wypróbować poniższy przykład. Używaj "-" przed szerokością, aby zapewnić lewe wcięcie. Domyślnie będą one poprawnie wcięte; które mogą nie odpowiadać twoim celom.

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

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

Formatowanie numeryczna jakości druku: https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

PS: To może iść jako komentarz do odpowiedzi DWB, ale ja wciąż nie masz uprawnień do komentowania i tak odpowiadając na to.

3

Prostym rozwiązaniem, które przychodzi na myśl jest mieć String blok przestrzeni:

String indent = "     "; // 20 spaces. 

Podczas drukowania ciąg, obliczyć wcięcia faktyczne i dodaj go do końca:

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

Spowoduje to pośredniczenie liczby spacji w ciągu znaków i umieszczenie ich wszystkich w tej samej kolumnie.

+0

Widząc takie odpowiedzi, żałuję, że Java 'String' nie ma' padLeft', 'padRight', itp. Jak inne standardowe biblioteki języków ... – Patashu

+1

Java ma StringUtils.leftPad() i StringUtils.rightPad(). są one częścią Apache Commons Lang. – DwB

6

Specyfikacje formatu dla printf i metody podobne do printf przyjmują opcjonalny parametr szerokości.

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

Dostosuj szerokości do żądanych wartości.

+8

Po pierwsze, nie dzwoń do kogoś leniwego, nie wiedząc nic o tej osobie. Po drugie, jestem początkującym użytkownikiem języka Java, ale przeczytałem o printf i wiem, że% 10d wydrukuje 10 spacji przed zmienną. Teraz Mr. Know-it-all-i-nie-leniwy, twój kod nie jest nawet w pobliżu tego, czego potrzebuję. Jeśli czytasz moje pytanie, muszę pozostawić wyrównanie, z wyjątkiem spacji po tym, jak druga zmienna musi się zmienić (nie stała), aby trzecia zmienna była również wyrównana.W każdym razie dzięki. Dobry dzień. – user1781482

+1

jeśli czytałeś dokumenty printf, to wiesz, że% 10d określa szerokość pola równą 10, a% 010d określa zero wypełnione lewym polem o szerokości 10. rozważ czytanie dokumentów. – DwB

+1

czytanie dokumentów pokaże ci, że - jako flaga opuści uzasadni to pole. ex% -10d – DwB

1

Oto potencjalne rozwiązanie, które ustawi szerokość kolumny bookType (tj. Format wartości bookTypes) na podstawie najdłuższej wartości bookTypes.

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

Można odwoływać się do tego bloga do drukowania sformatowany tekst na kolorowym konsoli

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