Semantic MediaWikiDit bericht verdwijnt nadat alle relevante taken zijn afgerond.

Er is één onvoltooide of openstaande taak, die nodig is om het installeren van Semantic MediaWiki te voltooien. Een beheerder of gebruiker met voldoende rechten kan deze uitvoeren. Dit moet worden gedaan voordat nieuwe gegevens worden toegevoegd om tegenstrijdigheden te voorkomen.

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
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)
    s = sourceStr:upper()
     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( s, defaultMsg )
     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

what



local 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