Spring til indhold

Modul:Formattal

Page extended-protected
Fra Wikipedia, den frie encyklopædi
Version fra 21. aug. 2016, 15:46 af Dipsacus fullonum (diskussion | bidrag) Dipsacus fullonum (diskussion | bidrag) (Modul til formatering af tal)
(forskel) ← Ældre version | Nuværende version (forskel) | Nyere version → (forskel)

local p = {}
local fejlkategori = "[[Kategori:Sider med tal hvis format ikke kendes af formattal]]"
--[[
  Formaterer et tal på dansk. Uanset om tallet fra start er uden tusinsadskillere eller bruger punktum eller komma,
  formateres det med punktummer som tusindsadskillere. Tallet må højst have 2 decimaler.
  Eksempler:
    123456 og 123,456 og 123.456 bliver til 123.456 (opfattes som et 6-cifret heltal)
    123,45 og 123.45 bliver til 123,45 (opfattes som et 3 cifret tal med 2 decimaler)
    123.456.7 giver fejl for ukendt format (tusindadskiller og decimaltegn er ens)
    123.456,789 giver fejl for ukendt format (bruger forskellige tusindadskillere) 
  Mellemrum og HTML-kommentarer i tallet ignores, andre tegn vil fejl.
  Ved fejl returnes tallet uændret sammen med en placering i en fejlkategori.
]]
function p.formattal (frame)
    local input = (frame.args[1] or "")
    input = string.gsub(input, "<!%-%-.-%-%->", "") -- Fjern HTML-kommentarer
    
    local tusindadskiller, output
    local heltal, decimaladskiller, decimaler = input:match("^%s*(.-)([,%.])(%d%d?)%s*$")
    if decimaladskiller then
        if decimaladskiller == "." then 
            heltal = string.gsub(heltal, "[,]", "") -- Fjern kommaer
        else
            heltal = string.gsub(heltal, "[%.]", "") -- Fjern punktummer
        end
    else
        local antal
        heltal, antal = string.gsub(input, ",", "") -- Fjern kommaer
        if antal == 0 then
            heltal = string.gsub(input, "%.", "") -- Ingen kommaer, fjern punktummer i stedet
        end
    end
    heltal = string.gsub(heltal, "%s", "") -- Fjern mellemrum
    if string.match(heltal, "%D") then
        return input .. fejlkategori
    end
    
    local antal = 1
    while antal ~= 0 do  
        heltal, antal = string.gsub(heltal, "^(%d+)(%d%d%d)", '%1.%2')
    end
 
    if decimaler then
        heltal = heltal .. "," .. decimaler
    end
    return heltal
end

return p