Módulo:BaseConvert
Convierte números a una base específica entre 2 y 36, para usar en plantillas tales como {{binario}}
, {{octal}}
, {{hexadecimal}}
, etc.
Ejemplo de uso:
local BaseConvert = require('Module:BaseConvert')
BaseConvert.convert({n = 14600926, base = 16}) -- returns 'DECADE'
Argumentos:
- n - (requerido) el número a convertir, como una cadena. Puede ser un número en cambio, si la base de entrada es 10.
- base - (requerida) la base a la cual se debe convertir el número. Puede estar entre 2 y 36, inclusive.
- desde - la base de la entrada. El valor predeterminado es 10 (o 16 si la entrada tiene un '0x' inicial). Tenga en cuenta que las bases distintas de 10 no son compatibles si la entrada tiene una parte fraccionaria.
- precisión - cantidad de dígitos que se representarán después del punto de base. Se agregarán ceros al final si es necesario. Si no se especifica, se mostrarán muchos *dígitos, hasta 10.
- ancho - número mínimo de dígitos para representar antes del punto de base. Se agregarán ceros a la izquierda si es necesario.
- predeterminado - valor para devolver si n está vacío o no es numérico. Se predetermina al valor de n.
- prefijo / sufijo - wikitexto para agregar antes / después del resultado devuelto. No se agregará si n está vacío o no es numérico. Por ejemplo, puede usar un prefijo de 0x al convertir a hexadecimal, o un sufijo de
<sub>8</sub>
al convertir a octal.
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