Ir al contenido

Módulo:Números

De Wikisource, la biblioteca libre.
Documentación del módulo


Uso

Esta documentación está transcluida desde Módulo:Números/doc.
Los editores pueden experimentar en la zona de pruebas de este módulo.
Por favor, añade las categorías e interwikis a la subpágina de documentación. Subpáginas de este módulo.

local z = {}
    
function z.Romano(frame)
  local numero,argumentos,parent
  local NumerosRomanosMenores4000 = {
     {3000, "MMM"},{2000, "MM"},{1000, "M"},
     {900, "CM"}, {800, "DCCC"}, {700, "DCC"}, {600, "DC"}, {500, "D"}, {400, "CD"},
     {300, "CCC"}, {200, "CC"}, {100, "C"},
     {90, "XC"},{80, "LXXX"},{70, "LXX"},{60, "LX"}, {50, "L"}, {40, "XL"}, 
     {30, "XXX"},{20, "XX"},{10, "X"},
     {9, "IX"}, {8, "VIII"},{7, "VII"},{6, "VI"}, {5, "V"}, {4, "IV"},
     {3, "III"},{2, "II"}, {1, "I"} 
  }
  if type(frame) == 'number' then -- Para poder llamarlo desde otro módulo fácilmente
      numero = frame
  else
      argumentos = frame.args;
      parent     = frame:getParent();
      numero     = tonumber(argumentos[1] or parent.args[1]) --Número decimal que se quiere convertir a numeración romana
  end

  if numero == nil or numero == "" or numero >= 4000 then return "" end
  
  local resultado = ''
    
  for _, v in ipairs( NumerosRomanosMenores4000 ) do
    local valor, letras = unpack( v )
    
    if numero >= valor then
       	numero    = numero - valor
       	resultado = resultado .. letras
    end
  end
  
  return resultado
end
function z.Arabico(frame)
	local str
	if type(frame) == 'string' then -- Para poder llamarlo desde otro módulo fácilmente
      str = frame
	else
      argumentos = frame.args;
      parent     = frame:getParent();
      str     = (argumentos[1] or parent.args[1]) --Número decimal que se quiere convertir a numeración romana
	end

	local strOrig = str
	str = str:upper()
	if not str:find( '^[MDCLXVI]+$' ) then
		return tonumber( str ) or strOrig
	end
	local smallRomans = { ['I'] = 1, ['V'] = 5, ['X'] = 10, ['L'] = 50, ['C'] = 100, ['D'] = 500, ['M'] = 1000 }
	local result = 0
	local old, n = 0
	for i = str:len(), 1, -1  do
		n = smallRomans[ str:sub( i, i ) ]
		if n < old then
			result = result - n
		else
			result = result + n
			old = n
		end
	end
	return result
end
return z