Форматирование чисел
С помощью .. можно построить любую строку, но числа не всегда получаются такими, как вам хочется. Цена 2.5 монеты выводится как 2.5, а не 2.50, а деление нацело выводит 5.0. Функция string.format даёт вам контроль. Вы передаёте ей шаблон — текст с метками-заполнителями, которые называются спецификаторами формата, и значения, которые нужно в них подставить:
local crop = "тыквы"
local count = 3
local price = 2.5
print(string.format("%d %s за %.2f монеты", count, crop, price))Программа выведет:
3 тыквы за 2.50 монетыКаждый спецификатор формата начинается с %:
%d— целое число,%.2f— десятичное число с 2 знаками после запятой, с округлением (%.1fдаёт один знак),%s— любое значение в виде текста: строка, число,true,nil…,%%— знак процента.
Значения подставляются в спецификаторы по порядку: первое значение — в первый, второе — во второй и так далее.
string.format сама ничего не выводит. Она возвращает готовый текст, который вы выводите или сохраняете в переменной:
local total = 10 / 4
local line = string.format("Итого: %.2f монеты", total)
print(line)
print(string.format("%d яиц", 10 / 2))
print(string.format("%d%% продано", 75))Программа выведет:
Итого: 2.50 монеты
5 яиц
75% продано%d вывел 5.0 как 5: он принимает float, если тот целый. Если нет, Lua сообщает об ошибке:
print(string.format("%d монет", 3.5))Lua сообщает:
main.lua:1: bad argument #2 to 'format' (number has no integer representation)Bad argument #2 означает, что второе значение, которое вы передали format, неверное (шаблон — первое). Number has no integer representation: 3.5 нельзя записать как целое число. Используйте %.2f или сначала округлите число, например с помощью math.floor.
Когда значения не хватает, получается похожая ошибка: string.format("%s и %s", "Эмма") заканчивается ошибкой bad argument #3 to 'format' (no value), потому что третьего значения нет.
Задание
- 1
Запустите программу. Первая строка выводится, а вторая заканчивается ошибкой:
totalравно 13.5, а%dпринимает только целые числа. Измените спецификатор формата, чтобы итог выводился с двумя знаками после запятой:Товар: клубника, коробок: 3 Итого монет: 13.50 - 2
Торговец Гуго платит только целыми монетами и округляет вниз. На следующей строке выведите, сколько он платит: используйте
%dиmath.floor:Товар: клубника, коробок: 3 Итого монет: 13.50 Гуго платит: 13 монет - 3
Наконец, выведите одной строкой запись для блокнота Эммы с помощью одного
string.format:%sдля товара,%dдля коробок и%.2fдля цены коробки и для итога:Товар: клубника, коробок: 3 Итого монет: 13.50 Гуго платит: 13 монет клубника: 3 x 4.50 = 13.50