<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://wiki.tokusatsus.com/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AFmtn</id>
	<title>Módulo:Fmtn - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tokusatsus.com/index.php?action=history&amp;feed=atom&amp;title=M%C3%B3dulo%3AFmtn"/>
	<link rel="alternate" type="text/html" href="https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Fmtn&amp;action=history"/>
	<updated>2026-07-05T07:53:31Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Fmtn&amp;diff=2431&amp;oldid=prev</id>
		<title>Tavoraadmin: Importando predefinição/módulo da Wikipédia em português para manter layout</title>
		<link rel="alternate" type="text/html" href="https://wiki.tokusatsus.com/index.php?title=M%C3%B3dulo:Fmtn&amp;diff=2431&amp;oldid=prev"/>
		<updated>2026-07-05T04:44:26Z</updated>

		<summary type="html">&lt;p&gt;Importando predefinição/módulo da Wikipédia em português para manter layout&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Padrões de construção conhecidos, com uma transformação para que se torne&lt;br /&gt;
-- um padrão válido.&lt;br /&gt;
-- O padrão não precisa ser perfeito, pois ele é validado como número&lt;br /&gt;
-- após a transformação.  Então não há problemas se ele eventualmente puder&lt;br /&gt;
-- produzir números inválidos.  Há apenas de tomar o cuidado para que não&lt;br /&gt;
-- produza números incorretos.&lt;br /&gt;
-- Obs.: Observar que muitos REGEXes não são válidos em Lua.&lt;br /&gt;
--       Veja a documentação em:&lt;br /&gt;
--       https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
local padroes_conhecidos = {&lt;br /&gt;
    {   &amp;quot;^[%d,]*%.%d*$&amp;quot;,     -- formato 1,123,123.123&lt;br /&gt;
        false,                 -- não necessita de revisão&lt;br /&gt;
        {&lt;br /&gt;
        	{ &amp;quot;,&amp;quot;, &amp;quot;&amp;quot; },           -- remove vírgulas&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {   &amp;quot;^[%d.]*,%d*$&amp;quot;,      -- formato 1.123.123,123 ou 1123123,123&lt;br /&gt;
        false,                 -- não marcar para revisão&lt;br /&gt;
        {&lt;br /&gt;
        	{ &amp;quot;%.&amp;quot;, &amp;quot;&amp;quot; },          -- remove pontos&lt;br /&gt;
        	{ &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;},           -- substitui vírgula por ponto&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {	&amp;quot;^[%d%s]*[,.]%d*$&amp;quot;,  -- formato 1 123 123,123 ou 1 123 123.123&lt;br /&gt;
        false,                 -- não marcar para revisão&lt;br /&gt;
        {&lt;br /&gt;
        	{ &amp;quot;%s&amp;quot;, &amp;quot;&amp;quot; },          -- remove espaços&lt;br /&gt;
        	{ &amp;quot;,&amp;quot;, &amp;quot;.&amp;quot;},           -- substitui vírgula por ponto, se houver&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {   &amp;quot;^[%d,]*,%d%d%d$&amp;quot;,   -- formato 1,123,123&lt;br /&gt;
        false,                 -- não marcar para revisão&lt;br /&gt;
        {&lt;br /&gt;
        	{ &amp;quot;,&amp;quot;, &amp;quot;&amp;quot; },           -- remove vírgulas&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
	{   &amp;quot;^[%d.]*%.%d%d%d$&amp;quot;,   -- formato 1.123.123 (três dígitos no último bloco)&lt;br /&gt;
        false,                  -- não marcar para revisão&lt;br /&gt;
        {&lt;br /&gt;
        	{ &amp;quot;,&amp;quot;, &amp;quot;&amp;quot; },            -- remove pontos&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {   &amp;quot;^[%d,]*,%d%d%d$&amp;quot;,   -- formato 1,123,123 (três dígitos no último bloco)&lt;br /&gt;
        false,                 -- não marcar para revisão&lt;br /&gt;
        {&lt;br /&gt;
        	{ &amp;quot;,&amp;quot;, &amp;quot;&amp;quot; },           -- remove vírgulas&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
	{   &amp;quot;^[%d%s]*%s%d%d%d$&amp;quot;, -- formato 1 123 123 (três dígitos no último bloco)&lt;br /&gt;
        false,                -- não marcar para revisão&lt;br /&gt;
        {&lt;br /&gt;
        	{ &amp;quot;%s&amp;quot;, &amp;quot;&amp;quot; },         -- remove espaços&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {   &amp;quot;^[%d.]*%.%d%d$&amp;quot;,   -- formato 1.123.12 (dois dígitos no último bloco)&lt;br /&gt;
        true,                 -- marcar para revisão&lt;br /&gt;
        {&lt;br /&gt;
        	{ &amp;quot;.&amp;quot;, &amp;quot;&amp;quot; },          -- remove pontos&lt;br /&gt;
        	{ &amp;quot;(%d%d)$&amp;quot;, &amp;quot;.%1&amp;quot; }, -- insere um ponto antes dos dois últimos dígitos&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {   &amp;quot;^[%d,]*,%d%d$&amp;quot;,    -- formato 1,123,12 (dois dígitos no último bloco)&lt;br /&gt;
        true,                 -- marcar para revisão&lt;br /&gt;
        {&lt;br /&gt;
        	{ &amp;quot;,&amp;quot;, &amp;quot;&amp;quot; },          -- remove vírgulas&lt;br /&gt;
        	{ &amp;quot;(%d%d)$&amp;quot;, &amp;quot;.%1&amp;quot; }, -- insere um ponto antes dos dois últimos dígitos&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    {   &amp;quot;^[%d%s]%s%d%d$&amp;quot;,    -- formato 1 123 12 (dois dígitos no último bloco)&lt;br /&gt;
        true,                 -- marcar para revisão&lt;br /&gt;
        {&lt;br /&gt;
        	{ &amp;quot;%s&amp;quot;, &amp;quot;&amp;quot; },          -- remove espaços&lt;br /&gt;
        	{ &amp;quot;(%d%d)$&amp;quot;, &amp;quot;.%1&amp;quot; }, -- insere um ponto antes dos dois últimos dígitos&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.fmtn(frame)&lt;br /&gt;
	local param1 = frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
	local param2 = frame.args[2] or &amp;quot;&amp;quot;&lt;br /&gt;
	local param3 = frame.args[3] or &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	num1, isnumber1, needcheck1 = reconhece_numero(param1)&lt;br /&gt;
	num2, isnumber2, needcheck2 = reconhece_numero(param2)&lt;br /&gt;
	num3, isnumber3, needcheck3 = reconhece_numero(param3)&lt;br /&gt;
	&lt;br /&gt;
	isarticle = mw.title.getCurrentTitle().namespace == 0&lt;br /&gt;
	&lt;br /&gt;
	prefixo = &amp;#039;&amp;#039;&lt;br /&gt;
	sufixo = &amp;#039;&amp;#039;&lt;br /&gt;
	if isnumber1 and not isnumber2 and not isnumber3 then&lt;br /&gt;
		-- somente o primeiro número é válido&lt;br /&gt;
		mynum = num1&lt;br /&gt;
		needcheck = needcheck1&lt;br /&gt;
		if param2 ~= &amp;#039;&amp;#039; then sufixo = sufixo .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. param2 end&lt;br /&gt;
		if param3 ~= &amp;#039;&amp;#039; then sufixo = sufixo .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. param3 end&lt;br /&gt;
	elseif not isnumber1 and isnumber2 and not isnumber3 then&lt;br /&gt;
		-- somente o segundo número é válido&lt;br /&gt;
		mynum = num2&lt;br /&gt;
		needcheck = needcheck2&lt;br /&gt;
		if param1 ~= &amp;#039;&amp;#039; then prefixo = prefixo .. param1 .. &amp;#039;&amp;amp;nbsp;&amp;#039; end&lt;br /&gt;
		if param3 ~= &amp;#039;&amp;#039; then sufixo = sufixo .. &amp;#039;&amp;amp;nbsp;&amp;#039; .. param3 end&lt;br /&gt;
	elseif not isnumber1 and not isnumber2 and isnumber3 then&lt;br /&gt;
		-- somente o terceiro número é válido&lt;br /&gt;
		mynum = num3&lt;br /&gt;
		needcheck = needcheck3&lt;br /&gt;
		if param1 ~= &amp;#039;&amp;#039; then prefixo = prefixo .. param1 .. &amp;#039;&amp;amp;nbsp;&amp;#039; end&lt;br /&gt;
		if param2 ~= &amp;#039;&amp;#039; then prefixo = prefixo .. param2 .. &amp;#039;&amp;amp;nbsp;&amp;#039; end&lt;br /&gt;
	else&lt;br /&gt;
		-- ERRO: existem mais de dois números válidos, ou nenhum é válido&lt;br /&gt;
		-- Nesse caso, faz o que já era feito antes, tenta formatar da forma&lt;br /&gt;
		-- que for possível e retorna os parâmetros na ordem que foram&lt;br /&gt;
		-- apresentados&lt;br /&gt;
		&lt;br /&gt;
		-- Aqui usa-se o &amp;quot;callParserFunction&amp;quot; para copiar o comportamento que já&lt;br /&gt;
		-- era presenciado antes desse módulo existir e evitar que erros sejam&lt;br /&gt;
		-- impressos nos artigos&lt;br /&gt;
		res = &amp;#039;&amp;#039;&lt;br /&gt;
		if param1 ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			res = res .. formatnum(param1)&lt;br /&gt;
		end&lt;br /&gt;
		if param2 ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			if res ~= &amp;#039;&amp;#039; then res = res .. &amp;#039;&amp;amp;nbsp;&amp;#039; end&lt;br /&gt;
			res = res .. formatnum(param2)&lt;br /&gt;
		end&lt;br /&gt;
		if param3 ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			if res ~= &amp;#039;&amp;#039; then res = res .. &amp;#039;&amp;amp;nbsp;&amp;#039; end&lt;br /&gt;
			res = res .. formatnum(param3)&lt;br /&gt;
		end&lt;br /&gt;
		if isarticle then&lt;br /&gt;
			res = res .. &amp;#039;[[Categoria:!Páginas com erro de uso da predefinição Fmtn]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		return res&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
  	res = prefixo .. formatnum(mynum) .. sufixo&lt;br /&gt;
  	if needcheck and isarticle then&lt;br /&gt;
  		res = res .. &amp;#039;[[Categoria:!Páginas cujo uso da predefinição Fmtn deve ser revisado]]&amp;#039;&lt;br /&gt;
  	end&lt;br /&gt;
  	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function formatnum(num)&lt;br /&gt;
	frame = mw.getCurrentFrame()&lt;br /&gt;
	return frame:callParserFunction{ name = &amp;#039;formatnum&amp;#039;, args = { num } }&lt;br /&gt;
	&lt;br /&gt;
	-- Não é utilizado pois não preserva o número de dígitos após a casa decimal&lt;br /&gt;
	-- lang = mw.language.getContentLanguage()&lt;br /&gt;
	-- return lang:formatNum(mynum)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function reconhece_numero(num)&lt;br /&gt;
	if tonumber(num) then&lt;br /&gt;
		-- já é um número válido, não precisa fazer nada&lt;br /&gt;
		isnumber = true&lt;br /&gt;
		needcheck = false&lt;br /&gt;
	else&lt;br /&gt;
		isnumber = false&lt;br /&gt;
		needcheck = true&lt;br /&gt;
		-- não é um número válido, observa os padrões para ver&lt;br /&gt;
		-- se pode ser convertido em um padrão válido&lt;br /&gt;
		for _, rule in pairs(padroes_conhecidos) do&lt;br /&gt;
			checkpattern = rule[1]&lt;br /&gt;
			if string.find(num, checkpattern) then&lt;br /&gt;
				newneedcheck = rule[2]&lt;br /&gt;
				substitutions = rule[3]&lt;br /&gt;
				&lt;br /&gt;
				newstr = num&lt;br /&gt;
				for _, subs in pairs(substitutions) do&lt;br /&gt;
					-- aplica a substituição na string&lt;br /&gt;
					newstr = string.gsub(newstr, subs[1], subs[2])&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				if tonumber(newstr) then&lt;br /&gt;
					-- verifica se a transformação produziu um número válido&lt;br /&gt;
					-- caso positivo, encerra o loop&lt;br /&gt;
					num = newstr&lt;br /&gt;
					isnumber = true&lt;br /&gt;
					needcheck = newneedcheck&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- se nenhum padrão bateu, então deve ser inválido&lt;br /&gt;
		-- deixa o código retornar o mesmo número passado e deixa que&lt;br /&gt;
		-- o chamador faça o seu trabalho&lt;br /&gt;
	end&lt;br /&gt;
	return num, isnumber, needcheck&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Tavoraadmin</name></author>
	</entry>
</feed>