Module:Rates: Difference between revisions
From Ephinea PSO Wiki
mNo edit summary |
mNo edit summary |
||
| Line 44: | Line 44: | ||
digits = math.max(digits, 0) | digits = math.max(digits, 0) | ||
end | end | ||
out = out .. string.format("%s", string.format(" %." .. digits .. "f", rate)):gsub("%.?0+$", "") | out = out .. string.format("%s", string.format("1/%." .. digits .. "f", rate)):gsub("%.?0+$", "") | ||
else | else | ||
out = out .. wholeFractions[rate] | out = out .. wholeFractions[rate] | ||
| Line 50: | Line 50: | ||
return out | return out | ||
elseif fmt == "p" then | elseif fmt == "p" then | ||
rate = string.format("%s%%", string.format("%f", string.format(" %.5f", rate*100)):gsub("%.?0+$", "")) | rate = string.format("%s%%", string.format("%f", string.format("%.5f", rate*100)):gsub("%.?0+$", "")) | ||
out = out .. rate | out = out .. rate | ||
return out | return out | ||
Revision as of 23:15, 30 April 2023
Documentation for this module may be created at Module:Rates/doc
local p = {}
local wholeFractions =
{
[0.9] = "9/10",
[0.88] = "22/25",
[0.875] = "7/8",
[0.85] = "17/20",
[0.8] = "4/5",
[0.6] = "3/5",
[0.5625] = "9/16",
[0.55] = "9/20",
[0.5] = "1/2"
}
function p.calcRate(frame)
return frame.args[1]*frame.args[2]
end
local function fmtRate(rate, fmt, digits)
local out = ""
if digits == nil then
digits = 0
end
local frac = {}
for number in string.gmatch(rate, '([^/]+)') do
table.insert(frac, number)
-- first time here is num, second time is den
-- third and beyond invalid
end
if frac[2] == nil then
frac[2] = 1
end
local num = frac[1]
local den = frac[2]
rate = num / den
if fmt == "f" then
if wholeFractions[rate] == nil then
if rate < 10 then
digits = math.max(digits, 2)
elseif rate < 100 then
digits = math.max(digits, 1)
else
digits = math.max(digits, 0)
end
out = out .. string.format("%s", string.format("1/%." .. digits .. "f", rate)):gsub("%.?0+$", "")
else
out = out .. wholeFractions[rate]
end
return out
elseif fmt == "p" then
rate = string.format("%s%%", string.format("%f", string.format("%.5f", rate*100)):gsub("%.?0+$", ""))
out = out .. rate
return out
end
end
function p.displayRate(frame)
local rate = frame.args[1]
local fmt = frame.args[2]
local digits = frame.args[3]
local out = ""
if fmt == "f" then
out = out .. fmtRate(rate, "f", digits)
elseif fmt == "p" then
out = out .. fmtRate(rate, "p")
elseif fmt == "n" then
out = out .. fmtRate(rate, "f", 2) .. " (" .. fmtRate(rate, "p") .. ")"
end
return out
end
return p