Módulo:Densidad
Uso
Este módulo consta de una única función de llamada externa, densidad
que vale para calcular la densidad a partir de dos parámetros: <población>
y <superficie>
o a partir de la Plantilla:Población y la superficie.
{{#Invoke:Densidad|densidad|<población>|<superficie>}}
En caso de que el módulo detecte que el primer parámetro empieza por una letra trata a los parámetros de forma diferente y los dos primeros los trata como pambiénarámetros de la plantilla: {{Población}}
(<cod ISO país>
y <cod entidad>
) y el tercero como <superficie>
.
{{#Invoke:Densidad|densidad|<cod iso país>|<cod entidad>|<superficie>}}
Para los valores de la población y la superficie no admite separador de millares pero para separar la parte decimal de la entera se admite tanto punto como coma.
--[[**************************************************************************************************************
*
* Nombre: Módulo:Densidad
*
* Descripción: Este módulo calcula la densidad de población dividiendo la población y
* la superficie o el valor que asigne la Plantilla:Población (dependiento del parámetro 1)
* y la superficie.
* Tiene funciones adicionales que depuran el número tomando de igual forma la coma y el punto
* como separador decimal.
*
************************************************************************************************************]]
local p = {}
local marco
function formatnum(numero)
--Función auxiliar para dar a los numeros el formato con separador de millares y decimales de acuerdo al manual de estilos
local fn = {}
if numero then
if type(num(numero)) == 'number' then
fn = mw.language.new('es'):formatNum(num(numero))
return fn
else
return ''
end
end
end
function num(numero)
--Función auxiliar para depurar los números. Elimina caracteres no numéricos y covierte el string en número.
local depurar = string.gsub(string.gsub(numero,',','.'),' ','') --Transforma el separador decimal si es coma en punto y elimina .
local num = tonumber(depurar)
return num
end
function dividir(dividendo,divisor)
-- Función auxiliar para dividir valores en la tabla principal sin que de error si uno o los dos valores son nulos
local cociente = {}
local resultado = {}
if dividendo and divisor then
if type(num(dividendo)) == 'number' and type(num(divisor)) == 'number' then
cociente = num(dividendo) / num(divisor)
resultado = formatnum(math.floor((cociente * 100) + 0.5) / 100)
return resultado
else
return '<strong class="error">Formato no válido</strong>'
end
end
end
function poblacion(pais,municipio)
--Función auxiliar que aplica la plantilla:Población
local dato = marco:expandTemplate{
title = 'Población',
args = {
pais, municipio, formato = 'no'
}
}
return dato
end
function p.densidad(frame)
marco = frame
local Pais = {}
local Municipio = {}
local Superficie = {}
local Poblacion = {}
local s = frame.args[1]
if mw.ustring.find(s, '%a') then -- Con esto detecta si el 1 er parametro es un cod ISO de país o el valor de la población
--Si detecta que es una letra aplica la plantilla población y los toma como: 1 cod ISO país, 2 cod entidad y 3 superficie.
Pais = frame.args[1]
Municipio = frame.args[2]
Superficie = frame.args[3]
Poblacion = poblacion(Pais,Municipio)
else
--De lo contrario lee los dos parámetros como 1 población y 2 superficie
Superficie = frame.args[2]
Poblacion = frame.args[1]
end
local Densidad = dividir(Poblacion,Superficie)--Calculamos la densidad
return Densidad
end
return p