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 Tausendertrennzeichen
  • decimalMark: Ü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