Module:Radix: Difference between revisions

From Nguhcraft Wiki
Jump to navigation Jump to search
Astaryuu (talk | contribs)
No edit summary
Astaryuu (talk | contribs)
Add separators to converted string
Line 50: Line 50:
    ret = ret .. string.sub(characters, digit, digit)
    ret = ret .. string.sub(characters, digit, digit)
    maxpower = maxpower / newradix
    maxpower = maxpower / newradix
    -- when maxpower hits 1:
    -- append a . if maxpower went below 1 and there is more to print
    -- append a . if maxpower went below 1 and there is more to print
    if maxpower < 1 and minpower < 1 then ret = ret .. "." end
    -- run separator function on ret
    if maxpower < 1 and minpower < 1 then
    ret = separator(ret, newradix)
    ret = ret .. "."
    end
    end
    end
    return ret
    return ret
Line 58: Line 63:
return tostring(decimal)
return tostring(decimal)
end
end
end
-- Meant for internal use only, adds "," between every 3-4 digits depending on radix
r.separator = function(cs, radix)
local dist = radix <= 6 and 3 or 4
local separator = dist == 3 and "," or " "
if string.len(cs) > dist then
local pos = dist
while pos < string.len(cs) do
cs = string.sub(cs, 1, pos*-1) .. separator .. string.sub(cs, pos*-1)
pos = pos + dist
end
end
return cs
end
end


return r
return r

Revision as of 18:50, 4 July 2026

Documentation for this module may be created at Module:Radix/doc

local r = {}

r.decimal_to = function(frame)
	-- Get arguments from call
	
	local decimal = math.abs(tonumber(frame.args[1]))
	local sign = decimal > 0 and "" or "-"
	-- If decimal is 1, return itself
	if decimal == 1 then
		return tostring(decimal)
	end
	-- Newradix is the radix to convert to
	local newradix = tonumber(frame.args[2])
	local characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	-- precision is the number of digits below 1 to use
	-- if decimal is less than 1/newradix ^ precision, return 0
	local precision = tonumber(frame.args[3]) or 0
	local minpower = newradix ^ (precision * -1)
	if decimal < minpower then
		return "0"
	end
	
	-- Weird radices
	-- If newradix is 1, just return decimal instead of erroring the formula
	if math.abs(newradix) == 1 then return tostring(decimal) end
	-- If newradix is negative it should use a different formulation; for now just do abs(newradix)
	if newradix < 0 then newradix = math.abs(newradix) end
	-- If newradix is nonintegral, character calculation is fucky, but probably fine
	
	-- final string to yeet everything into
	local ret = "" .. sign
	
	local maxpower = 1
	if decimal > 0 then
	    -- Get highest power of newradix less than decimal
	    while maxpower < decimal do
	    	maxpower = maxpower * newradix
	    end
	    maxpower = maxpower / newradix
	    -- Double loop
	    -- Outer loop: While maxpower >= minpower, add result of second loop to ret
	    -- Inner loop: While decimal >= maxpower, subtract maxpower from decimal
	    while maxpower >= minpower do
	    	local digit = 1
	    	while decimal >= maxpower do
	    		decimal = decimal - maxpower
	    		digit = digit + 1
	    	end
	    	-- digit now contains number of maxpowers, concat it onto ret
	    	ret = ret .. string.sub(characters, digit, digit)
	    	maxpower = maxpower / newradix
	    	-- when maxpower hits 1:
	    	-- append a . if maxpower went below 1 and there is more to print
	    	-- run separator function on ret
	    	if maxpower < 1 and minpower < 1 then
	    		ret = separator(ret, newradix)
	    		ret = ret .. "."
	    	end
	    end
	    return ret
	else
		-- Decimal is 0, also return itself
		return tostring(decimal)
	end
end

-- Meant for internal use only, adds "," between every 3-4 digits depending on radix
r.separator = function(cs, radix)
	local dist = radix <= 6 and 3 or 4
	local separator = dist == 3 and "," or " "
	
	if string.len(cs) > dist then
		local pos = dist
		while pos < string.len(cs) do
			cs = string.sub(cs, 1, pos*-1) .. separator .. string.sub(cs, pos*-1)
			pos = pos + dist
		end
	end
	
	return cs
end

return r