(9 tussenliggende versies door dezelfde gebruiker niet weergegeven) | |||
Regel 12: | Regel 12: | ||
local chars = { "I", "V", "X", "L", "C", "D", "M" } | local chars = { "I", "V", "X", "L", "C", "D", "M" } | ||
− | -- Convert | + | function p.runToRomanNum( str, default ) |
+ | -- todo | ||
+ | end | ||
+ | |||
+ | --[[ | ||
+ | Convert Arabic to Roman numerals (uppercase) | ||
+ | ]]-- | ||
function p.toRomanNum(frame) | function p.toRomanNum(frame) | ||
--s = tostring(s) | --s = tostring(s) | ||
Regel 41: | Regel 47: | ||
end | end | ||
− | function p. | + | function p.runToArabicNum( s, defaultMsg ) |
− | + | s = s:upper() | |
− | + | local ret = 0 | |
− | + | local i = 1 | |
− | |||
− | |||
while i <= s:len() do | while i <= s:len() do | ||
--for i = 1, s:len() do | --for i = 1, s:len() do | ||
local c = s:sub(i, i) | local c = s:sub(i, i) | ||
if c ~= " " then -- allow spaces | if c ~= " " then -- allow spaces | ||
− | local m = map[c] or | + | 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 next = s:sub(i + 1, i + 1) | ||
Regel 73: | Regel 78: | ||
end | end | ||
return ret | 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 | end | ||
return p | return p |
Huidige versie van 10 aug 2023 om 15:31
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