Modulo:BaseConvert

Questo modulo serve a...

Modulo:BaseConvert
Info Istruzioni per l'uso
Questo è un modulo scritto in Lua. Le istruzioni che seguono sono contenute nella sottopagina Modulo:BaseConvert/man (modifica · cronologia)
Sandbox: Modulo:BaseConvert/sandbox (modifica · cronologia) · Sottopagine: lista · Test: Modulo:BaseConvert/test

Questo modulo serve a...

Converte i numeri in specifiche basi tra 2 e 36, da usare in template come {{binario}}, {{ottale}}, {{esadecimale}}, ecc.

Esempio d'uso:

local BaseConvert = require('Module:BaseConvert')
BaseConvert.convert({n = 14600926, base = 16}) -- restituisce 'DECADE'
-- o, se usato una sola volta,
local BaseConvert = require('Module:BaseConvert').convert({n = 14600926, base = 16}) -- restituisce 'DECADE'

Argomenti:

  • n - (richiesto) il numero da convertire, come una stringa. Deve essere un numero, se la base dell'input input è 10.
  • base - (richiesto) la base a cui il numero dev'essere convertito. Può essere tra 2 e 36, estremi inclusi.
  • from - la base dell'input. Preimpostata a 10 (o 16 se l'input ha prefisso '0x'). Notare che per basi diverse da 10 non sono supportati input con parte frazionale.
  • precision - numero di cifre decimali da mostrare a destra della virgola. Se non specificato, saranno mostrate fino a 10 cifre.
  • width - minimo numero di cifre non decimali da mostrare a sinistra della virgola. Gli zeri iniziali vengono aggiunti se necessari.
  • default - Valore da restituire se n è vuoto o non numerico. Per impostazioni predefinite è il valore di n.
  • prefix / suffix - wikitesto da aggiungere a sinistra/destra il risultato. Non sarà aggiunto se n è vuoto o non numerico. Per esempio, devi usare il prefisso 0x quando converti ad hex, od il suffisso <sub>8</sub> quando converti ad ottale.

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 #invoke 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

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.