Module:Coins

From Roat Pkz
Revision as of 19:30, 23 March 2024 by Hefner (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Documentation for this module may be created at Module:Coins/doc

-- <pre>
-- Implements {{Coins}}
-- Original source: http://runescape.wiki/w/Module:Coins?action=history

local p = {}

local function amount(a)
	-- convert used globals to locals where possible to improve performance
	local math = math
	local string = string
	local table = table
	local mw = mw
        local expr = mw.ext.ParserFunctions.expr

	local ret = {'<span class="coins coins-', true, true, true, '</span>'}

	-- strip commas from input
	-- @example '123,456,789'
	a = string.gsub(a, ',', '')
	
	-- check for decimals/division to determine if output should have forced 2 decimal places
	local has_decimal_or_division = false
	if string.match(a, "[./]") then
		has_decimal_or_division = true
	end
	
	-- for performance reasons, only calculate expr if required
	if tonumber(a) == nil then
		a = tonumber(expr(a)) or 0
	end
	
	-- round to two decimal places
	a = math.floor(a * 100 + 0.5) / 100

	local num = math.abs(a)
	local amounts = {1000, 250, 100, 25, 5, 4, 3, 2, 1}
	local result = 1000
	
	for _, amount in ipairs(amounts) do
		result = amount
		if num >= amount then
			break
		end
	end

	ret[2] = tostring(result)

	-- set a class to denote positive or negative (css sets the colour)
	if a > 0 then
		ret[3] = ' coins-pos">'
	elseif a < 0 then
		ret[3] = ' coins-neg">'
	else
		ret[3] = '">'
	end
	
	-- format number with commas
	if has_decimal_or_division then
		local b = 0
		a, b = math.modf(a)
		b = math.abs(b)
		-- hack fix for formatNum stripping the sign from -0
		if (a > 999 or a < -999) then
			a = mw.language.getContentLanguage():formatNum(a)
		end
		b = string.sub(string.format("%.2f", b),2)
		ret[4] = a..b
	else
		ret[4] = mw.language.getContentLanguage():formatNum(a)
	end

	return table.concat( ret )
end

--
-- {{Coins}} access point
--
function p.amount(frame)
	local args = frame:getParent().args
	-- for {{coins|111}}
	local a = args[1] or '0'
	return amount(a)
end

--
-- Module access point
--
function p._amount(a)
	a = tostring(a) or '0'
	return amount(a)
end

return p