Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Average change

From Wikipedia, the free encyclopedia
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