Module:Percentage: Difference between revisions

From Zoophilia Wiki
Jump to navigationJump to search
meta>Frietjes
No edit summary
Ookami (talk | contribs)
m 29 revisions imported
 
(24 intermediate revisions by 3 users not shown)
Line 10: Line 10:
local function rnd(num, digits)
local function rnd(num, digits)
-- This function implements {{rnd}}
-- This function implements {{rnd}}
return math_module._precision_format(tostring(num), tostring(digits))
return math_module._precision_format(tostring(num), digits)
end
end


Line 18: Line 18:
end
end


function percentage(n1, n2, prec, suffix, pad, sigfig)
function _nonscinote(num)
local pct = tonumber(n1)/tonumber(n2)
-- This function undoes scientific notation
skey = '<span style="display:none" data-sort-value="'
if mw.ustring.match(num or '', '^%s*(%d)%.(%d+)<span[^<>]*>×</span>10<sup>([%-−]*)(%d)</sup>%s*$') then
.. sortkey._sortKeyForNumber(pct) .. '♠"></span>'
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 sigfig ~= '' then
return skey .. rnd(pct, tonumber(sigfig) - oom(pct) - 1) .. suffix
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
end
if pad ~= '' then
if pad ~= '' then
return skey .. rnd(pct, prec) .. suffix
return skey .. fmtout(rnd(pct, prec), sn) .. suffix
end
end
return skey .. pct .. suffix
prec = (prec < 0) and 0 or prec
if pct ~= 0 then
-- if pct > 0 then
pct = ((pct < 0) and -1 or 1)*math.floor(math.abs(pct * 10^prec) + 0.5) / 10^prec
-- pct = math.floor(pct / 10^prec + 0.5) * 10^prec
end
-- else
-- pct = math.floor(pct / 10^prec - 0.5) * 10^prec
-- end
-- return skey .. pct .. suffix
return skey .. fmtout(pct, sn) .. suffix
end
end


function p.main(frame)
function p.main(frame)
return percentage(frame.args[1] or '0', frame.args[2] or '100', tonumber(frame.args[3]) or 0, frame.args['%'] or '%', frame.args['pad'] or '', frame.args['sigfig'] or '')
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
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