Mô đun:BaseConvert

local p = {}

local digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'

function normalizeFullWidthChars(s)
    return mw.ustring.gsub(s, '[!-~]', function(s) 
        return mw.ustring.char(mw.ustring.codepoint(s, 1) - 0xFEE0) 
    end)    
end

function _convert(n, base, from, precision, width, default, prefix, suffix)
    n = '' .. n   -- convert to a string
    
    -- strip off any leading '0x' (unless x is a valid digit in the input base)
    from = tonumber(from)
    if not from or from < 34 then
        local c
        n, c = n:gsub('^(-?)0[Xx]', '%1')
        if c > 0 and not from then from = 16 end
    end

    -- check for a negative sign. Do this while the input is still in string form,
    -- because tonumber doesn't support negative numbers in non-10 bases.
    local sign = ''
    local c
    n, c = n:gsub('^-', '')
    if c > 0 then sign = '-' end
    
    -- replace any full-width Unicode characters in the string with their ASCII equivalents
    n = normalizeFullWidthChars(n)
    
    -- handle scientific notation with whitespace around the 'e' e.g. '5 e7'
    n = n:gsub('%s*[eE]%s*', 'e')
    
    from = from or 10
    local num = tonumber(n, from)
    base = tonumber(base)
    precision = tonumber(precision)
    width = tonumber(width)
    
    if not num or not base then return default or n end
    
    local i, f = math.modf(num)

    local t = {}
    repeat
        local d = (i % base) + 1
        i = math.floor(i / base)
        table.insert(t, 1, digits:sub(d, d))
    until i == 0
    while #t < (width or 0) do
        table.insert(t, 1, '0') 
    end
    local intPart = table.concat(t, '')
    
    -- compute the fractional part
    local tf = {}
    while f > 0 and #tf < (precision or 10) do
        f = f * base
        i, f = math.modf(f)
        table.insert(tf, digits:sub(i + 1, i + 1))
    end
    
    -- add trailing zeros if needed
    if precision and #tf < precision then
        for i = 1, precision - #tf do
            table.insert(tf, '0') 
        end
    end

    fracPart = table.concat(tf, '')
    
    -- remove trailing zeros if not needed
    if not precision then
        fracPart = fracPart:gsub('0*$', '')
    end
    
    -- add the radix point if needed
    if #fracPart > 0 then
        fracPart = '.' .. fracPart
    end
    
    return (prefix or '') .. sign .. intPart .. fracPart .. (suffix or '')
end

function p.convert(frame)
    -- Allow for invocation via #gọi or directly from another module
    local args
    if frame == mw.getCurrentFrame() then
        args = frame.args
    else
        args = frame
    end
    
    local n = args.n
    local base = args.base
    local from = args.from
    local precision = args.precision
    local width = args.width
    local default = args.default
    local prefix = args.prefix
    local suffix = args.suffix
    return _convert(n, base, from, precision, width, default, prefix, suffix)
end

return p
Chúng tôi bán
Bài viết liên quan
Limerence - Có lẽ đó không chỉ là crush
Limerence - Có lẽ đó không chỉ là crush
I want you forever, now, yesterday, and always. Above all, I want you to want me
Những con quỷ không thể bị đánh bại trong Kimetsu no Yaiba
Những con quỷ không thể bị đánh bại trong Kimetsu no Yaiba
Nếu Akaza không nhớ lại được quá khứ nhờ Tanjiro, anh sẽ không muốn tự sát và sẽ tiếp tục chiến đấu
Nhân vật Keisuke Baji trong Tokyo Revengers
Nhân vật Keisuke Baji trong Tokyo Revengers
Keisuke Baji (Phát âm là Baji Keisuke?) là một thành viên của Valhalla. Anh ấy cũng là thành viên sáng lập và là Đội trưởng Đội 1 (壱番隊 隊長, Ichiban-tai Taichō?) của Băng đảng Tokyo Manji.
YG chính thức phủ nhận tin đồn hẹn hò giữa Rosé và Kang Dong Won
YG chính thức phủ nhận tin đồn hẹn hò giữa Rosé và Kang Dong Won
Trước đó chúng tôi đã thông báo rằng đây là chuyện đời tư của nghệ sĩ nên rất khó xác nhận. Tuy nhiên vì có nhiều suy đoán vô căn cứ nên chúng tôi thông báo lại 1 lần nữa