Module:Percentage: Difference between revisions
From Zoophilia Wiki
Jump to navigationJump to search
meta>Frietjes No edit summary |
m 29 revisions imported |
||
(6 intermediate revisions by 3 users not shown) | |||
Line 18: | Line 18: | ||
end | end | ||
function | function _nonscinote(num) | ||
-- This function undoes scientific notation | |||
if mw.ustring.match(num or '', '^%s*(%d)%.(%d+)<span[^<>]*>×</span>10<sup>([%-−]*)(%d)</sup>%s*$') then | |||
local a,b,c,d = mw.ustring.match(num or '', '^%s*(%d)%.(%d+)<span[^<>]*>×</span>10<sup>([%-−]*)(%d)</sup>%s*$') | |||
d = tonumber(d) or 1 | |||
if c ~= '' then | |||
return '0.' .. mw.ustring.rep('0', d - 1) .. a .. b | |||
else | |||
return a .. mw.ustring.sub(b .. mw.ustring.rep('0', d ), 1, d) | |||
end | |||
end | |||
return num | |||
end | |||
local function fmtout(num,snote) | |||
if snote then | |||
return _nonscinote(num) | |||
else | |||
return num | |||
end | |||
end | |||
function _percentage(n1, n2, prec, suffix, pad, sigfig, sn) | |||
local pct = 100*n1/n2 | local pct = 100*n1/n2 | ||
skey = '<span data-sort-value="' | skey = '<span data-sort-value="' | ||
Line 27: | Line 49: | ||
if sigfig ~= '' then | if sigfig ~= '' then | ||
if pct ~= 0 then | if pct ~= 0 then | ||
return skey .. rnd(pct, tonumber(sigfig) - oom(pct) - 1) .. suffix | return skey .. fmtout(rnd(pct, tonumber(sigfig) - oom(pct) - 1), sn) .. suffix | ||
else | else | ||
return skey .. rnd(pct, tonumber(sigfig) - 3) .. suffix | return skey .. fmtout(rnd(pct, tonumber(sigfig) - 3), sn) .. suffix | ||
end | end | ||
end | end | ||
if pad ~= '' then | if pad ~= '' then | ||
return skey .. rnd(pct, prec) .. suffix | return skey .. fmtout(rnd(pct, prec), sn) .. suffix | ||
end | end | ||
Line 41: | Line 63: | ||
end | end | ||
return skey .. pct .. suffix | return skey .. fmtout(pct, sn) .. suffix | ||
end | end | ||
function p.main(frame) | function p.main(frame) | ||
return | local args = frame.args[1] and frame.args or frame:getParent().args | ||
tonumber( | local yesno = require('Module:Yesno') | ||
tonumber( | return _percentage( | ||
tonumber( | tonumber(args[1]) or 0, | ||
tonumber(args[2]) or 100, | |||
tonumber(args[3]) or tonumber(args['pad']) or 0, | |||
args['%'] or '%', args['pad'] or '', | |||
args['sigfig'] or '', | |||
yesno(args['nonscinote'] or 'no') | |||
) | ) | ||
end | end | ||
return p | return p |
Latest revision as of 00:52, 3 September 2020
Documentation for this module may be created at Module:Percentage/doc
--
-- This module implements [[Template:Percentage]]
--
local p = {}
local math_module = require( "Module:Math" )
local precision = math_module._precision
local sortkey = require( "Module:Sortkey" )
local function rnd(num, digits)
-- This function implements {{rnd}}
return math_module._precision_format(tostring(num), digits)
end
local function oom(num)
-- This function implements {{order of magnitude}}
return math_module._order(tostring(num))
end
function _nonscinote(num)
-- This function undoes scientific notation
if mw.ustring.match(num or '', '^%s*(%d)%.(%d+)<span[^<>]*>×</span>10<sup>([%-−]*)(%d)</sup>%s*$') then
local a,b,c,d = mw.ustring.match(num or '', '^%s*(%d)%.(%d+)<span[^<>]*>×</span>10<sup>([%-−]*)(%d)</sup>%s*$')
d = tonumber(d) or 1
if c ~= '' then
return '0.' .. mw.ustring.rep('0', d - 1) .. a .. b
else
return a .. mw.ustring.sub(b .. mw.ustring.rep('0', d ), 1, d)
end
end
return num
end
local function fmtout(num,snote)
if snote then
return _nonscinote(num)
else
return num
end
end
function _percentage(n1, n2, prec, suffix, pad, sigfig, sn)
local pct = 100*n1/n2
skey = '<span data-sort-value="'
.. sortkey._sortKeyForNumber(pct) .. '♠" style="display:none"></span>'
-- prec = math.floor(prec)
if sigfig ~= '' then
if pct ~= 0 then
return skey .. fmtout(rnd(pct, tonumber(sigfig) - oom(pct) - 1), sn) .. suffix
else
return skey .. fmtout(rnd(pct, tonumber(sigfig) - 3), sn) .. suffix
end
end
if pad ~= '' then
return skey .. fmtout(rnd(pct, prec), sn) .. suffix
end
prec = (prec < 0) and 0 or prec
if pct ~= 0 then
pct = ((pct < 0) and -1 or 1)*math.floor(math.abs(pct * 10^prec) + 0.5) / 10^prec
end
return skey .. fmtout(pct, sn) .. suffix
end
function p.main(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
local yesno = require('Module:Yesno')
return _percentage(
tonumber(args[1]) or 0,
tonumber(args[2]) or 100,
tonumber(args[3]) or tonumber(args['pad']) or 0,
args['%'] or '%', args['pad'] or '',
args['sigfig'] or '',
yesno(args['nonscinote'] or 'no')
)
end
return p