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,',','.'),'&nbsp;','') --Transforma el separador decimal si es coma en punto y elimina &nbsp;. 
    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