Jump to content

Module:Pop density and Module:Pop density/sandbox: Difference between pages

(Difference between pages)
Page 1
Page 2
Content deleted Content added
fix double sort key
 
No edit summary
 
Line 5: Line 5:
local math_module = require( "Module:Math" )
local math_module = require( "Module:Math" )
local precision = math_module._precision
local precision = math_module._precision
local sortkey = require( "Module:Sortkey" )


local function rnd(num, digits)
local function rnd(num, digits)
Line 43: Line 42:


local function popdensity(pop, area1, areaunit1, areaunit2, prec, disp, flip)
local function popdensity(pop, area1, areaunit1, areaunit2, prec, disp, flip)
local dens1, dens1sort, prec1
local dens1, prec1 = nil, nil
local dens2, dens2sort, prec2
local dens2, prec2 = nil, nil
local str1, str2 = '', ''
local str1, str2 = '', ''
local uniterror = '<sup>[[Template:Pop density|?Unknown unit?]]</sup>[[Category:Pop density using unsupported units]]'
local uniterror = '<sup>[[Template:Pop density|?Unknown unit?]]</sup>[[Category:Pop density using unsupported units]]'
Line 50: Line 49:
if(pop ~= '' and area1 ~= '') then
if(pop ~= '' and area1 ~= '') then
-- pop and area are defined
-- pop and area are defined
local popnum = tonumber(pop)
local dens1num = tonumber(pop)/tonumber(area1)
if not popnum then
error(string.format('Unable to convert population "%s" to a number', pop), 2)
end
local area1num = tonumber(area1)
if not area1num then
error(string.format('Unable to convert area "%s" to a number', area1), 2)
end
local dens1num = popnum/area1num
local unit1 = unitnames[areaunit1] or nil
local unit1 = unitnames[areaunit1] or nil
local unit2 = unitnames[areaunit2] or nil
local unit2 = unitnames[areaunit2] or nil
prec1 = (prec ~= '') and tonumber(prec)
prec1 = (prec ~= '') and tonumber(prec) or (1+math.log10(2*area1/(1/10^precision(pop)+pop/area1/10^precision(area1))))
or (1+math.log10(2*area1/(1/10^precision(pop)+pop/area1/10^precision(area1))))
dens1 = rnd(dens1num, math.floor(prec1 + 0.5))
dens1 = rnd(dens1num, math.floor(prec1 + 0.5))
dens1sort = '<span style="display:none" data-sort-value="'
.. sortkey._sortKeyForNumber(dens1num) .. '♠"></span>'
if (unit1) then
if (unit1) then
str1 = '/' .. unitstr[unit1]
str1 = '/' .. unitstr[unit1]
Line 75: Line 62:
prec2 = prec1 - math.log10(mult)
prec2 = prec1 - math.log10(mult)
dens2 = rnd(dens1num*mult, math.floor(prec2 + 0.5))
dens2 = rnd(dens1num*mult, math.floor(prec2 + 0.5))
dens2sort = '<span style="display:none" data-sort-value="'
.. sortkey._sortKeyForNumber(dens1num*mult) .. '♠"></span>'
str2 = '/' .. unitstr[unit2]
str2 = '/' .. unitstr[unit2]
elseif(areaunit2 ~= '') then
elseif(areaunit2 ~= '') then
Line 103: Line 88:
if( str2 ~= '' ) then
if( str2 ~= '' ) then
-- has a converted unit
-- has a converted unit
if( disp ~= 'num' and disp ~= 'table' ) then
if( disp ~= 'num' ) then
-- display input and output density numbers with units
-- display input and output density numbers with units
if( flip == 'on' ) then
if( flip == 'on' ) then
return (dens2sort or '') .. dens2 .. str2 .. ' (' .. dens1 .. str1 .. ')'
return dens2 .. str2 .. ' (' .. dens1 .. str1 .. ')'
else
else
return (dens1sort or '') .. dens1 .. str1 .. ' (' .. dens2 .. str2 .. ')'
return dens1 .. str1 .. ' (' .. dens2 .. str2 .. ')'
end
end
elseif( disp == 'table') then
dens1 = (dens1sort or '') .. dens1
dens2 = (dens2sort or '') .. dens2
return pop .. '||' .. area1 .. '||' .. dens1 .. '||' .. dens2
else
else
-- display output density number without unit
-- display output density number without unit
Line 120: Line 101:
else
else
-- no converted unit
-- no converted unit
if( disp ~= 'num' and disp ~= 'table' ) then
if( disp ~= 'num' ) then
-- display input density number with unit
-- display input density number with unit
return (dens1sort or '') .. dens1 .. str1
return dens1 .. str1
elseif( disp == 'table') then
return pop .. '||' .. area1 .. '||' ..(dens1sort or '') .. dens1
else
else
-- display input density number without unit
-- display input density number without unit
Line 136: Line 115:
function p.density(frame)
function p.density(frame)
local args = (frame.args[3] ~= nil) and frame.args or frame:getParent().args
local args = (frame.args[3] ~= nil) and frame.args or frame:getParent().args
return popdensity(args[1] or '', args[2] or '', args[3] or '', args[4] or '', args['prec'] or '', args['disp'] or '', args['flip'] or '')
return popdensity(
args[1] or '', args[2] or '', args[3] or '', args[4] or '',
args['prec'] or '', args['disp'] or '', args['flip'] or ''
)
end
end