Semantic MediaWikiDit bericht verdwijnt nadat alle relevante taken zijn afgerond.

Er is één onvoltooide of openstaande taak, die nodig is om het bijwerken 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
Regel 44: Regel 44:
local sourceStr = mw.text.unstrip(frame.args[1])
local sourceStr = mw.text.unstrip(frame.args[1])
     --s = tonumber(s)
     --s = tonumber(s)
     s = frame:upper(sourceStr)
     s = sourceStr:upper()
     local ret = 0
     local ret = 0
     local i = 1
     local i = 1

Versie van 9 aug 2023 18:52

Module:ConvertNumerals

Summary
35 -> XXXV


XXXV -> 35

Need to check for validity of Roman numeral first, or provide a default in event of error

Luafout op regel 53: Unknown Roman Numeral 'B'



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" }

-- Convert arabric to roman numerals
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.toArabicNum(frame)
	local sourceStr = mw.text.unstrip(frame.args[1])
    --s = tonumber(s)
    s = sourceStr: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 error( "Unknown Roman Numeral '" .. c .. "'" )
            
            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

return p