Formátování a sloupce
string.format znáte z lekce o proměnných: vloží hodnoty do textu podle formátovacích značek, %d pro celé číslo, %.2f pro desetinné číslo se dvěma desetinnými místy a %s pro text. format je funkce pro řetězce jako ostatní, takže ji můžete zavolat i jako metodu na textu se značkami:
local jmeno = "Bella"
local litry = 18.5
print(string.format("%s dala %.1f litru mléka", jmeno, litry))
print(("%s dala %.1f litru mléka"):format(jmeno, litry))Vypíše:
Bella dala 18.5 litru mléka
Bella dala 18.5 litru mlékaOba řádky dělají totéž; metoda potřebuje kolem textu závorky, jak už víte. Lua píše desetinnou tečku, ne čárku; jak ji vyměnit za čárku, uvidíte ve cvičení o nahrazování. %s přijme jakoukoli hodnotu, nejen text: ("%s"):format(true) je "true". A protože % začíná značku, znak procenta se píše jako %%: ("%d%%"):format(75) je "75%".
Číslo mezi % a písmenem značky určuje šířku: kolik znaků hodnota zabere nejméně. Kratší hodnota se doplní mezerami zleva, takže je zarovnaná doprava. S mínusem jdou mezery doprava a hodnota je zarovnaná doleva. Hranaté závorky v příkladu ukazují, kde každá hodnota začíná a končí:
print(("[%5d]"):format(42))
print(("[%-5d]"):format(42))
print(("[%8s]"):format("pes"))
print(("[%-8s]"):format("pes"))
print(("[%7.2f]"):format(3.14159))Vypíše:
[ 42]
[42 ]
[ pes]
[pes ]
[ 3.14]U %7.2f je 7 celková šířka i s desetinnou tečkou a 2 je počet desetinných míst. Šířky potřebujete pro tabulku se zarovnanými sloupci. Bez nich je každý řádek jen tak dlouhý jako jeho hodnoty a čísla jsou každé jinde:
print(("%s %d"):format("vejce", 14))
print(("%s %d"):format("med", 9))
print(("%s %d"):format("jahody", 120))Vypíše:
vejce 14
med 9
jahody 120Se šířkami jsou sloupce zarovnané:
print(("%-12s %4d"):format("vejce", 14))
print(("%-12s %4d"):format("med", 9))
print(("%-12s %4d"):format("jahody", 120))Vypíše:
vejce 14
med 9
jahody 120Názvy patří doleva, proto %-12s; čísla doprava, aby jednotky a desítky byly pod sebou, proto %4d. Šířku volte podle nejdelší hodnoty ve sloupci: delší hodnota se neořízne, jen rozbije zarovnání.
Častá chyba je značka, ke které chybí hodnota:
print(("%s a %s"):format("vejce"))main.lua:1: bad argument #2 to 'format' (no value)Hláška říká, že na jednu ze značek nezbyla hodnota (no value). Spočítejte značky a hodnoty: hodnot musí být stejně jako značek (%% se nepočítá, ta žádnou hodnotu nepotřebuje). Text před dvojtečkou Lua mezi argumenty nepočítá, proto hláška říká #2; string.format("%s a %s", "vejce") hlásí #3, jako v lekci o proměnných.
A ještě jedna věc: šířky počítají bajty a písmeno s diakritikou zabírá dva. Řádek s „dýní“ by se posunul o dvě místa. Proto jsou názvy v tomto cvičení bez diakritiky; v dalším cvičení uvidíte, jak si s diakritikou poradit.
Jak psát:
Pokyny
Změňte print v cyklu tak, aby používal format: název zarovnaný doleva ve sloupci širokém 10 znaků, mezera, hmotnost zarovnaná doprava ve sloupci širokém 6 znaků se 2 desetinnými místy a za ní mezera a kg. Výpis bude vypadat takto:
mrkev 12.50 kg
brambory 30.00 kg
jahody 4.25 kgPod cyklus vypište řádek s celkovou hmotností: text Celkem ve sloupci názvů a součet hmotností ve sloupci hmotností. Hmotnosti sečtěte v cyklu. Řádek bude vypadat takto:
Celkem 46.75 kgZačněte programovat zdarma
4/9