Modulo:Formatnum retrocompatibile

Versione del 15 apr 2022 alle 17:21 di Daimona Eaytoy (discussione | contributi) (Da Modulo:Sandbox/Daimona Eaytoy/Formatnum)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

Questo modulo serve a formattare i numeri nel parametro in input. Il risultato è molto simile alla funzione parser formatnum, che il modulo utilizza internamente, con le seguenti differenze:

  • Se l'argomento è un numero avente solo virgole come separatore, viene lasciato inalterato;
  • Se l'argomento è un numero avente solo spazi ed evenutalmente punti come separatori, converte gli spazi in spazi indivisibili (come separatori delle migliaia);
  • In caso di intervalli numerici (ad es. "123-456"), il trattino non viene convertito in un segno meno (U+2212).

Il modulo va utilizzato solamente nei parametri dei template che si aspettano un numero da formattare, ma a cui molte voci passano un valore non strettamente numerico. Poiché passare argomenti non numerici a formatnum è deprecato, la pagina verrebbe categorizzata in Categoria:Pagine con argomenti di formatnum non numerici. Il modulo cerca di evitarlo, aggiungendo invece delle categorie di tracciamento più specifiche che permettono di capire meglio come viene usato il parametro:


local p={};

function p.main(frame)
	local str = frame.args[1];

	if mw.ustring.match( str, "^%-?[%d.]+$" ) then
		-- Caso semplice, un numero nel formato corretto
		return p._formatnum( str );
	elseif mw.ustring.match( str, "^[%d.,]+,[%d.,]+$" ) then
		-- Numero con virgole, lasciamo inalterato
		return str .. '[[Categoria:Modulo formatnum usato con virgole]]';
	elseif mw.ustring.match( str, "^[%d.]+ *%- *[%d.]+$" ) then
		-- Intervallo numerico, formattiamo solo i numeri escludendo il trattino
		return ( mw.ustring.gsub( str, "[%d.]+", p._formatnum ) ) .. '[[Categoria:Modulo formatnum usato con intervallo]]';
	elseif mw.ustring.match( str, "^%a+ %-?[%d.]+$" ) then
		-- Parola seguita dal numero (ad es. "circa 123"), formattiamo il numero
		return ( mw.ustring.gsub( str, "%-?[%d.]+", p._formatnum ) ) .. '[[Categoria:Modulo formatnum usato con testo prima del numero]]';
	elseif mw.ustring.match( str, "^%a+ [%d.]+ *%- *[%d.]+$" ) then
		-- Parola seguita da intervallo, formattiamo i numeri escludendo il trattino
		return ( mw.ustring.gsub( str, "[%d.]+", p._formatnum ) ) .. '[[Categoria:Modulo formatnum usato con testo e intervallo]]';
	else
		-- Tutto il resto. Usiamo formatnum direttamente
		return p._formatnum( str ) .. '[[Categoria:Modulo formatnum usato con qualcosa di imprevisto]]';
	end
end

function p._formatnum( str )
	return mw.getCurrentFrame():preprocess( "{{formatnum:" .. str .. "}}" );
end	

return p