Module:Average change: Difference between revisions
Appearance
Content deleted Content added
m case sensitive |
change error message to dash and add 6th param option |
||
Line 11: | Line 11: | ||
local class = args.class |
local class = args.class |
||
local omitop = args.omitop |
local omitop = args.omitop |
||
local params = { args[1], args[2], args[3], args[4], args[5] } |
local params = { args[1], args[2], args[3], args[4], args[5], args[6] } |
||
-- Filter out nil values and convert to numbers |
-- Filter out nil values and convert to numbers |
||
Line 22: | Line 22: | ||
end |
end |
||
-- |
-- Dash (blank) if fewer than 2 valid values |
||
if #values < 2 then |
if #values < 2 then |
||
return ' |
return '—' |
||
end |
end |
||
Latest revision as of 12:25, 27 July 2024
local getArgs = require('Module:Arguments').getArgs
local p = {}
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
-- Main function to calculate average change
function p._main(args)
local class = args.class
local omitop = args.omitop
local params = { args[1], args[2], args[3], args[4], args[5], args[6] }
-- Filter out nil values and convert to numbers
local values = {}
for _, v in ipairs(params) do
v = tonumber(v)
if v then
table.insert(values, v)
end
end
-- Dash (blank) if fewer than 2 valid values
if #values < 2 then
return '—'
end
-- Calculate changes
local changes = {}
for i = 1, #values - 1 do
if class == "percent" then
table.insert(changes, ((values[i + 1] - values[i]) / values[i]) * 100)
else
table.insert(changes, values[i + 1] - values[i])
end
end
-- Calculate average change
local sum = 0
for _, change in ipairs(changes) do
sum = sum + change
end
local avgChange = sum / #changes
local formattedChange = string.format("%.2f", avgChange)
-- Omit the operator if specified
if omitop == "yes" then
formattedChange = string.gsub(formattedChange, "^%-", "")
end
return formattedChange
end
return p