Перейти к содержимому страницы
Открыть меню
Переключить меню настроек
Открыть персональное меню
Вы не представились системе
Ваш IP-адрес будет виден всем, если вы внесёте какие-либо изменения.

Модуль:RomanConvert

Материал из вики «Вече»

Для документации этого модуля может быть создана страница Модуль:RomanConvert/doc

local p = {}

local roman_numerals = {
	I = 1,
	V = 5,
	X = 10,
	L = 50,
	C = 100,
	D = 500,
	M = 1000
}

-- Convert Roman to Arabic
local function roman_to_numeral(roman)
	if type(roman) ~= "string" then return -1, "roman numeral not a string" end
	local rev = roman:upper():reverse()
	local raising = true
	local last = 0
	local result = 0
	for i = 1, #rev do
		local c = rev:sub(i, i)
		local next = roman_numerals[c]
		if next == nil then return -1, "roman numeral contains illegal character " .. c end
		if next > last then
			result = result + next
			raising = true
		elseif next < last then
			result = result - next
			raising = false
		elseif raising then
			result = result + next
		else
			result = result - next
		end
		last = next
	end
	return result
end

-- Main function
function p.convert(frame)
	local input = frame.args[1] or ""
	local num, err = roman_to_numeral(input)
	if num ~= -1 and err == nil then
		return tostring(num)
	else
		return input
	end
end

return p