Module:Number: Difference between revisions

From Melvor Idle
(Add general numbers function for handling numerical values)
 
m (Add functions for numeric parsing with suffixes (k, m, b, etc))
Line 5: Line 5:
local p = {}
local p = {}


--[[
local numberSuffixes = {
    Parses a string representation of a number with suffixes (k, m, b, t, q, s, o, n, d).
 
    Parameters:
        str (string): The string to parse.
 
    Returns:
        number: The numeric value represented by the input string or 0 if the string is NaN.
]]
function p.parseNumber(str)
local suffixes = {
         k = 1e3,
         k = 1e3,
         m = 1e6,
         m = 1e6,
Line 26: Line 16:
         d = 1e30
         d = 1e30
     }
     }
   
--- Parses a string representation of a number with suffixes
-- @param str (string) The string to parse.
-- @return (number) The numeric value represented by the input string or 0 if the string is NaN.
function p.parseNumber(str)
-- Empty/nil string.
if not str or str == "" then
return 0
end


-- Empty/nil string.
-- If the input is already a number, return it.
if not str or str == "" then
local number = tonumber(str)
         return 0
    if number then
         return number
     end
     end
      
      
    local numStr = str:sub(1, -2)
     local suffix = str:sub(-1):lower()
     local suffix = str:sub(-1):lower()
     local multiplier = suffixes[suffix] or 1
      
     local number = tonumber(str)
    if tonumber(numStr) then
    local multiplier = numberSuffixes[suffix] or 1
    return numStr * multiplier
    else
    return 0
     end
end
 
--- Format a number with optional suffixes based on its magnitude.
-- @param number (number) The number to be formatted.
-- @param decimals (number) [optional] The number of decimals to include in the formatted output. Default is 2.
-- @return (string) The formatted number as a string
function p.abbreviateNumber(number, decimals)
if type(number) ~= "number" then
        error("NaN")
    end
-- Round to two decimals by default.
    decimals = decimals or 2


    if not number then
for suffix, value in pairs(numberSuffixes) do
         return 0
        if number >= value then
            if number % 1 ~= 0 then
                return string.format("%." .. decimals .. "f%s", number / value, suffix)
            else
                return string.format("%.0f%s", number / value, suffix)
            end
         end
     end
     end


     return number * multiplier
     return tostring(number)
end
end
return p

Revision as of 22:04, 12 March 2024

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

--
-- Module that contains functions related to numeric formatting or number manipulation
--

local p = {}

local numberSuffixes = {
        k = 1e3,
        m = 1e6,
        b = 1e9,
        t = 1e12,
        q = 1e15,
        s = 1e18,
        o = 1e21,
        n = 1e24,
        d = 1e30
    }
    
--- Parses a string representation of a number with suffixes
-- @param str (string) The string to parse.
-- @return (number) The numeric value represented by the input string or 0 if the string is NaN.
function p.parseNumber(str)
	-- Empty/nil string.
	if not str or str == "" then 
		return 0 
	end

	-- If the input is already a number, return it.
	local number = tonumber(str)
    if number then
        return number
    end
    
    local numStr = str:sub(1, -2)
    local suffix = str:sub(-1):lower()
    
    if tonumber(numStr) then
    	local multiplier = numberSuffixes[suffix] or 1
    	return numStr * multiplier
    else
    	return 0
    end
end

--- Format a number with optional suffixes based on its magnitude.
-- @param number (number) The number to be formatted.
-- @param decimals (number) [optional] The number of decimals to include in the formatted output. Default is 2.
-- @return (string) The formatted number as a string
function p.abbreviateNumber(number, decimals)
	if type(number) ~= "number" then
        error("NaN")
    end
	-- Round to two decimals by default.
    decimals = decimals or 2

	for suffix, value in pairs(numberSuffixes) do
        if number >= value then
            if number % 1 ~= 0 then
                return string.format("%." .. decimals .. "f%s", number / value, suffix)
            else
                return string.format("%.0f%s", number / value, suffix)
            end
        end
    end

    return tostring(number)
end

return p