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éka

Oba řá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 120

Se šíř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        120

Ná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.

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 kg

Pod 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 kg

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

4/9