Module:ConvertNumerals
Summary
35 -> XXXV
XXXV -> 35
Need to check for validity of Roman numeral first, or provide a default in event of error
whatlocal p = {} local map = { I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000, } local numbers = { 1, 5, 10, 50, 100, 500, 1000 } local chars = { "I", "V", "X", "L", "C", "D", "M" } function p.runToRomanNum( str, default ) -- todo end --[[ Convert Arabic to Roman numerals (uppercase) ]]-- function p.toRomanNum(frame) --s = tostring(s) local sourceNumber = mw.text.unstrip(frame.args[1]) s = tonumber(sourceNumber) if not s or s ~= s then error "Unable to convert to number" end if s == math.huge then error "Unable to convert infinity" end s = math.floor(s) if s <= 0 then return s end local ret = "" for i = #numbers, 1, -1 do local num = numbers[i] while s - num >= 0 and s > 0 do ret = ret .. chars[i] s = s - num end --for j = i - 1, 1, -1 do for j = 1, i - 1 do local n2 = numbers[j] if s - (num - n2) >= 0 and s < num and s > 0 and num - n2 ~= n2 then ret = ret .. chars[j] .. chars[i] s = s - (num - n2) break end end end return ret end function p.runToArabicNum( s, defaultMsg ) s = s:upper() local ret = 0 local i = 1 while i <= s:len() do --for i = 1, s:len() do local c = s:sub(i, i) if c ~= " " then -- allow spaces local m = map[c] or "unknown Roman numeral" if m == "unknown Roman numeral" then return defaultMsg end local next = s:sub(i + 1, i + 1) local nextm = map[next] if next and nextm then if nextm > m then -- if string[i] < string[i + 1] then result += string[i + 1] - string[i] -- This is used instead of programming in IV = 4, IX = 9, etc, because it is -- more flexible and possibly more efficient ret = ret + (nextm - m) i = i + 1 else ret = ret + m end else ret = ret + m end end i = i + 1 end return ret end --[[ Convert Roman to Arabic numerals ]]-- function p.toArabicNum(frame) local sourceStr = mw.text.unstrip(frame.args[1]) --s = tonumber(s) if frame.args[2] == nil then local defaultMsg = "Unknown Roman numeral" else defaultMsg = mw.text.unstrip(frame.args[2]) end res = p.runToArabicNum( sourceStr, defaultMsg ) return res end return p