Modulo:Formatnum it

Da Wikivoyage.

La documentazione per questo modulo può essere creata in Modulo:Formatnum it/man

--[[
Mentre la magic word Formatnum applica una formattazione generica, questo modulo
applica una formattazione "italiana", ossia: virgola come separatore decimale, 
punto delle migliaia e possibilità di inserire un simbolo per l'unità di misura 
e la sintassi finanziaria per i numeri negativi
]]--
local p = {}
local getArgs = require('Module:Arguments').getArgs

local function separatore_migliaia(amount, symbol)
	local formatted = amount
	local k = 0
	symbol = symbol or '.'
	repeat
		formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1' .. symbol .. '%2')
	until k == 0
	return formatted
end

local function round(num, idp)
	local mult = 10^(idp or 0)
	return math.floor(num * mult + 0.5) / mult
end

local function formatNum(amount, decimal, suffix, neg_prefix)
	decimal = decimal or 2  -- i decimali di default sono 2
	neg_prefix = neg_prefix or "-" -- il simbolo di default è il meno

	local famount = math.abs(round(amount,decimal))
	famount = math.floor(famount)

	-- Aggiungo il separatore delle migliaia (i.e. ".")
	local formatted = separatore_migliaia(famount)
	
	-- metto in coda i decimali col loro separatore (i.e. ",")
	if (decimal > 0) then
		local remain = round(math.abs(amount) - famount, decimal)
		remain = string.sub(tostring(remain),3)
		formatted = formatted .. "," .. remain ..
		string.rep("0", decimal - string.len(remain))
	end
	
	-- metto in coda l'eventuale suffisso (e.g '€')
	formatted = formatted .. (suffix or "")
	
	-- formatto come richiesto l'eventuale numero negativo
	if (amount<0) then
		formatted = neg_prefix == "()" and ("(" .. formatted .. ")") or (neg_prefix .. formatted)
	end
	
	return formatted
end

function p.main(frame)
	local args = getArgs(frame )
	local num = tonumber( args[1] or args.num or '' )
	local prec = tonumber( args[2] or args.prec ) or 2
	local suffix = args.suffix or ''
	local neg_prefix = args.neg_prefix or '-'
	
	return num and formatNum(num, prec, suffix, neg_prefix) or ''
end


return p