Module:BaseConvert
Appearance
--
-- Converts numbers to a specified base between 2 and 36, for use in
-- templates such as {{binary}}, {{octal}}, {{hexadecimal}}, etc.
--
-- If a number is passed in the precision argument, that number of digits
-- will be shown following the radix point. If no precision is specified,
-- however many digits are needed will be shown, up to 10.
--
local p = {}
function p._convert(n, base, precision)
n = tonumber(n)
local digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
local sign = ''
if n < 0 then
sign = '-'
n = -n
end
local i, f = math.modf(n)
local t = {}
repeat
local d = (i % base) + 1
i = math.floor(i / base)
table.insert(t, 1, digits:sub(d, d))
until i == 0
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 sign .. intPart .. fracPart
end
function p.convert(frame)
local n = frame.args.n
local base = frame.args.base
local precision = frame.args.precision
return p._convert(n, base, precision)
end
return p