Module:Coins2: Difference between revisions

From Roat Pkz
Jump to navigation Jump to search
(Created page with "-- <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'...")
 
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
-- <pre>
-- Implements {{Coins}}
-- Original source: http://runescape.wiki/w/Module:Coins?action=history
local p = {}
local p = {}


local function amount(a)
local function amount(a)
-- convert used globals to locals where possible to improve performance
    -- convert used globals to locals where possible to improve performance
local math = math
    local math = math
local string = string
    local string = string
local table = table
    local table = table
local mw = mw
    local mw = mw
        local expr = mw.ext.ParserFunctions.expr
    local expr = mw.ext.ParserFunctions.expr
 
    -- strip commas from input
    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


local ret = {'<span class="coins coins-', true, true, true, '</span>'}
    -- for performance reasons, only calculate expr if required
    if tonumber(a) == nil then
        a = tonumber(expr(a)) or 0
    end


-- strip commas from input
    -- round to two decimal places if necessary
-- @example '123,456,789'
    if has_decimal_or_division then
a = string.gsub(a, ',', '')
        a = math.floor(a * 100 + 0.5) / 100
    else
-- check for decimals/division to determine if output should have forced 2 decimal places
        a = math.floor(a + 0.5)
local has_decimal_or_division = false
    end
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)
    -- format number with commas
local amounts = {1000, 250, 100, 25, 5, 4, 3, 2, 1}
    local formatted_number
local result = 1000
    if has_decimal_or_division then
        local integer_part, fractional_part = math.modf(a)
for _, amount in ipairs(amounts) do
        fractional_part = math.abs(fractional_part)
result = amount
if num >= amount then
break
end
end


ret[2] = tostring(result)
        if (integer_part > 999 or integer_part < -999) then
            integer_part = mw.language.getContentLanguage():formatNum(integer_part)
        end


-- set a class to denote positive or negative (css sets the colour)
        if fractional_part == 0 then
if a > 0 then
            formatted_number = tostring(integer_part)
ret[3] = ' coins-pos">'
        else
elseif a < 0 then
            fractional_part = string.sub(string.format("%.2f", fractional_part), 2)
ret[3] = ' coins-neg">'
            formatted_number = integer_part .. fractional_part
else
        end
ret[3] = '">'
    else
end
        formatted_number = mw.language.getContentLanguage():formatNum(a)
    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 )
    return formatted_number
end
end


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


Line 87: Line 67:
--
--
function p._amount(a)
function p._amount(a)
a = tostring(a) or '0'
    a = tostring(a) or '0'
return amount(a)
    return amount(a)
end
end


return p
return p

Latest revision as of 09:28, 19 May 2024

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

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

    -- strip commas from input
    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 if necessary
    if has_decimal_or_division then
        a = math.floor(a * 100 + 0.5) / 100
    else
        a = math.floor(a + 0.5)
    end

    -- format number with commas
    local formatted_number
    if has_decimal_or_division then
        local integer_part, fractional_part = math.modf(a)
        fractional_part = math.abs(fractional_part)

        if (integer_part > 999 or integer_part < -999) then
            integer_part = mw.language.getContentLanguage():formatNum(integer_part)
        end

        if fractional_part == 0 then
            formatted_number = tostring(integer_part)
        else
            fractional_part = string.sub(string.format("%.2f", fractional_part), 2)
            formatted_number = integer_part .. fractional_part
        end
    else
        formatted_number = mw.language.getContentLanguage():formatNum(a)
    end

    return formatted_number
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