Modul:NumberFormat
Verwendung Bearbeiten
Formatiert eine Zahl sprachabhängig mit Tausender- und Dezimaltrennzeichen. Das Modul ist von den MediaWiki üblichen Modulen inspiriert, jedoch stark abgeschwächt für unsere Bedürfnisse und daher neu entwickelt. Ziel war es, die Sprachkomplexität zu reduzieren und die Funtkionen für Währungen und Einheiten aus dem Modul zu lösen , um die spätere Wartung und Erweiterung einfacher zu handhaben.
Syntax Bearbeiten
–
Parameter Bearbeiten
Zahl: Die zu formatierende Zahl (erforderlich)lang:de,at,ch,en(optional, default:en)decimals: Nachkommastellen, auf die gerundet wird (optional)thousandsSep: Überschreibt TausendertrennzeichendecimalMark: Überschreibt Dezimalzeichen
Beispiele Bearbeiten
–→1.234.567,89–→1,234,567.89–→1’234’567.89
-- Modul:NumberFormat – leichtgewichtiges Sprach-abhängiges Zahlenformat
local p = {}
local formats = {
['de'] = { th = '.', dec = ',' },
['at'] = { th = '.', dec = ',' },
['ch'] = { th = '’', dec = '.' },
['en'] = { th = ',', dec = '.' }
}
-- Fallback auf EN bei unbekannter Sprache
local fallback = formats['en']
-- Hilfsfunktion zur Rundung
local function round(num, decimals)
local mult = 10 ^ (decimals or 0)
return math.floor(num * mult + 0.5) / mult
end
-- Tausendertrennung einfügen
local function insertThousandsSep(intPart, sep)
local result = ""
local len = #intPart
for i = 1, len do
local digit = intPart:sub(len - i + 1, len - i + 1)
if i > 1 and (i - 1) % 3 == 0 then
result = sep .. result
end
result = digit .. result
end
return result
end
function p.main(frame)
local args = frame:getParent().args
local num = tonumber(args[1])
if not num then return "–" end
local lang = (args.lang or 'en'):lower()
local fmt = formats[lang] or fallback
local decimals = tonumber(args.decimals) or nil
local th = args.thousandsSep or fmt.th
local dec = args.decimalMark or fmt.dec
if decimals then
num = round(num, decimals)
end
local numStr = tostring(num)
local intPart, fracPart = numStr:match("^(%-?%d+)[%.%.,]?(%d*)$")
intPart = insertThousandsSep(intPart, th)
if decimals and decimals > 0 then
fracPart = fracPart .. string.rep("0", decimals - #fracPart)
fracPart = fracPart:sub(1, decimals)
end
if fracPart and #fracPart > 0 then
return intPart .. dec .. fracPart
else
return intPart
end
end
return p