Как заполнить десятичные разряды числа нулями?

Предположим, следующие числа:

local a = 2
local b = 3.1
local c = 1.43
local d = 1.0582

Моя цель — округлить эти числа до двух знаков после запятой. Результат должен быть таким, соответственно:

a = 2.00
b = 3.10
c = 1.43
d = 1.06 or 1.05

Очевидно, я понимаю, что любое число с завершающими десятичными нулями будет округлено. 2.00 будет 2. Но мне нужны числа в виде строк, и чтобы сделать их визуально более привлекательными, мне понадобятся эти два десятичных знака.

Вот функция, которую я использую для округления до двух знаков после запятой:

function round(num, numDecimalPlaces)
local mult = 10^(numDecimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
end

Это прекрасно работает для тестовых случаев c и d, но даст неверные результаты с a и b: он не будет заполнен нулями. Я понимаю, что это потому, что функция округления берет числа и вычисляет их, поэтому лишние нули обрезаются.

Но это точно не моя цель - не отрезать их.

Я пытался манипулировать строками, проверяя, находится ли . в числе и где, но это не сработало вообще ни в каком случае. Мой метод:

local zei
if i < 100 then
    if tostring(i):find("%.") == nil then
        zei = round(i, 2) .. ".00" --No decimal point found, append .00
    else
        zei = round(i, 2) --Found decimal point, round to 2
    end
    if tostring(i):find("%.")+2 == tostring(i):len() then
        zei = round(i, 2) .. "0" --Found point, but only one trailing number, append 0
    end
else
    zei = round(i, 0) --Number is over 100, no decimal points needed
end

Случай 100 выше приведен только для красоты и здесь не актуален. Где zei — отображаемая строка, а i — один из номеров тестового примера.

Резюме

Как бы я округлил число до двух знаков после запятой, но добавил конечные нули, даже если они были избыточными, например. 2.30? Я понимаю, что мне нужны строки для этого.

Противоречный вопрос: Удалить лишние нули


person devRicher    schedule 02.01.2017    source источник


Ответы (1)


Вы не округляете числа. Вы создаете строковые представления этих чисел. Это сделает string.format в соответствующем формате. Как это:

string.format("%.2f", a);
person Nicol Bolas    schedule 02.01.2017