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 mince

Každá značka začíná znakem %:

  • %d je celé číslo,
  • %.2f je desetinné číslo na 2 desetinná místa, zaokrouhlené (%.1f dá jedno místo),
  • %s je 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í.

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 mince

Obchodní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.50

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

9/10