Geen bewerkingssamenvatting |
Geen bewerkingssamenvatting |
||
| (2 tussenliggende versies door dezelfde gebruiker niet weergegeven) | |||
| Regel 48: | Regel 48: | ||
function p.runToArabicNum( s, defaultMsg ) | function p.runToArabicNum( s, defaultMsg ) | ||
s = s:upper() | |||
local ret = 0 | 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 | ||
| Regel 85: | Regel 86: | ||
local sourceStr = mw.text.unstrip(frame.args[1]) | local sourceStr = mw.text.unstrip(frame.args[1]) | ||
--s = tonumber(s) | --s = tonumber(s) | ||
if frame.args[2] == nil then | if frame.args[2] == nil then | ||
local defaultMsg = "Unknown Roman numeral" | local defaultMsg = "Unknown Roman numeral" | ||
else defaultMsg = mw.text.unstrip(frame.args[2]) | else defaultMsg = mw.text.unstrip(frame.args[2]) | ||
end | end | ||
res = p.runToArabicNum( | res = p.runToArabicNum( sourceStr, defaultMsg ) | ||
return res | return res | ||
end | end | ||
return p | return p | ||
Huidige versie van 10 aug 2023 14: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
