Formátování čísel
Pomocí .. sestavíte jakýkoli řádek, ale čísla nevypadají vždycky tak, jak chcete. Cena 2,5 mince se vypíše jako 2.5, ne 2.50, a dělení, které vyjde beze zbytku, vypíše 5.0. S funkcí string.format máte výpis pod kontrolou. Dáte jí šablonu, text s formátovacími značkami, a hodnoty, které do nich má dosadit:
local plodina = "dýně"
local pocet = 3
local cena = 2.5
print(string.format("%d %s za %.2f mince", pocet, plodina, cena))Vypíše:
3 dýně za 2.50 minceKaždá značka začíná znakem %:
%dje celé číslo,%.2fje desetinné číslo na 2 desetinná místa, zaokrouhlené (%.1fdá jedno místo),%sje jakákoli hodnota jako text: řetězec, číslo,true,nil…,%%je znak procenta.
Hodnoty se dosazují popořadě: první hodnota do první značky, druhá do druhé a tak dál.
string.format sama nic nevypíše. Vrátí hotový text, a ten pak vypíšete nebo uložíte do proměnné:
local celkem = 10 / 4
local radek = string.format("Celkem: %.2f mince", celkem)
print(radek)
print(string.format("%d vajec", 10 / 2))
print(string.format("Prodáno %d %%", 75))Vypíše:
Celkem: 2.50 mince
5 vajec
Prodáno 75 %Značka %d vypsala 5.0 jako 5: desetinné číslo přijme, pokud je celé. Jinak Lua ohlásí chybu:
print(string.format("%d mincí", 3.5))Lua ohlásí:
main.lua:1: bad argument #2 to 'format' (number has no integer representation)Bad argument #2 znamená, že druhá hodnota předaná funkci format je špatně (první je šablona). Number has no integer representation: číslo 3.5 nejde zapsat jako celé. Použijte %.2f, nebo číslo nejdřív zaokrouhlete, třeba pomocí math.floor.
Když hodnota chybí, dostanete podobnou chybu: string.format("%s a %s", "Ema") skončí hláškou bad argument #3 to 'format' (no value), protože třetí hodnota chybí.
Jak psát:
Pokyny
Spusťte program. První řádek se vypíše, ale druhý skončí chybou: celkem je 13.5 a %d bere jen celá čísla. Změňte značku tak, aby se celková cena vypsala na dvě desetinná místa:
jahody: 3 krabičky
Celkem: 13.50 minceObchodník Hugo platí jen celými mincemi a zaokrouhluje dolů. Na další řádek vypište, kolik zaplatí: použijte %d a math.floor:
jahody: 3 krabičky
Celkem: 13.50 mince
Hugo zaplatí: 13 mincíNakonec vypište jedním string.format řádek do Emina sešitu: %s pro položku, %d pro krabičky a %.2f pro cenu krabičky i pro celkovou cenu:
jahody: 3 krabičky
Celkem: 13.50 mince
Hugo zaplatí: 13 mincí
jahody: 3 x 4.50 = 13.50Začněte programovat zdarma
9/10