Formatieren und Spalten
string.format kennst du schon aus der Lektion über Variablen: Es setzt Werte nach seinen Formatangaben in einen Text ein, %d für eine Ganzzahl, %.2f für eine Dezimalzahl mit zwei Nachkommastellen und %s für einen Text. format ist eine Zeichenkettenfunktion wie die anderen, du kannst sie also auch als Methode auf den Text mit den Formatangaben aufrufen:
local name = "Berta"
local liter = 18.5
print(string.format("%s gab %.1f Liter Milch", name, liter))
print(("%s gab %.1f Liter Milch"):format(name, liter))Das gibt Folgendes aus:
Berta gab 18.5 Liter Milch
Berta gab 18.5 Liter MilchBeide Zeilen tun dasselbe; die Methode braucht, wie du weißt, die Klammern um den Text. %s nimmt jeden Wert, nicht nur einen Text: ("%s"):format(true) ist "true". Und weil % eine Formatangabe einleitet, schreibst du ein Prozentzeichen als %%: ("%d%%"):format(75) ist "75%".
Eine Zahl zwischen dem % und dem Buchstaben legt die Breite fest: wie viele Zeichen der Wert mindestens belegt. Ein kürzerer Wert wird links mit Leerzeichen aufgefüllt, steht also rechtsbündig. Mit einem Minus kommen die Leerzeichen nach rechts, und der Wert steht linksbündig. Die eckigen Klammern in diesem Beispiel zeigen, wo jeder Wert beginnt und endet:
print(("[%5d]"):format(42))
print(("[%-5d]"):format(42))
print(("[%8s]"):format("Huhn"))
print(("[%-8s]"):format("Huhn"))
print(("[%7.2f]"):format(3.14159))Das gibt Folgendes aus:
[ 42]
[42 ]
[ Huhn]
[Huhn ]
[ 3.14]In %7.2f ist 7 die gesamte Breite, der Dezimalpunkt eingeschlossen, und 2 die Zahl der Nachkommastellen. Breiten brauchst du für eine Tabelle, bei der alles untereinander steht. Ohne sie ist jede Zeile nur so lang wie ihre Werte, und die Zahlen stehen kreuz und quer:
print(("%s %d"):format("Eier", 14))
print(("%s %d"):format("Milch", 9))
print(("%s %d"):format("Erdbeeren", 120))Das gibt Folgendes aus:
Eier 14
Milch 9
Erdbeeren 120Mit Breiten stehen die Spalten untereinander:
print(("%-12s %4d"):format("Eier", 14))
print(("%-12s %4d"):format("Milch", 9))
print(("%-12s %4d"):format("Erdbeeren", 120))Das gibt Folgendes aus:
Eier 14
Milch 9
Erdbeeren 120Namen stehen links, also %-12s; Zahlen stehen rechts, damit Einer und Zehner untereinander stehen, also %4d. Wähle die Breite nach dem längsten Wert der Spalte: Ein längerer Wert wird nicht abgeschnitten, er bringt nur die Ausrichtung durcheinander.
Ein typischer Fehler ist eine Formatangabe ohne Wert:
print(("%s und %s"):format("Eier"))main.lua:1: bad argument #2 to 'format' (no value)Die Meldung sagt, dass eine der Formatangaben keinen Wert bekommen hat. Zähle die Formatangaben und die Werte: Es müssen genauso viele Werte wie Formatangaben sein (%% zählt nicht, es braucht keinen Wert). Beim Doppelpunkt zählt Lua den Text davor nicht als Argument, deshalb steht in der Meldung #2; string.format("%s und %s", "Eier") meldet #3, wie in der Lektion über Variablen.
Noch etwas zu Breiten: Sie zählen Bytes, und ein Buchstabe mit Umlaut belegt zwei. Eine Zeile mit Käse wäre um eine Stelle verschoben. Deshalb haben die Namen in dieser Übung keine Umlaute; die nächste Übung zeigt, wie du damit umgehst.
So schreibst du es:
Anweisungen
- 1
Ändere das
printin der Schleife so, dass esformatbenutzt: der Name linksbündig in einer Spalte von 12 Zeichen Breite, ein Leerzeichen, das Gewicht rechtsbündig in einer Spalte von 6 Zeichen Breite mit 2 Nachkommastellen, dann ein Leerzeichen undkg. Die Ausgabe sieht so aus:Karotten 12.50 kg Kartoffeln 30.00 kg Erdbeeren 4.25 kg - 2
Gib unter der Schleife eine Zeile mit der Summe aus: den Text
Summein der Spalte der Namen und die Summe der Gewichte in der Spalte der Gewichte. Addiere die Gewichte in der Schleife. Die Zeile sieht so aus:Summe 46.75 kg