Модуль: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