Module:FormatNum

From Ways of Darkness
Jump to navigation Jump to search

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

    -- from sam_lie
    -- Compatible with Lua 5.0 and 5.1.
    -- Disclaimer : use at own risk especially for hedge fund reports :-)

    ---============================================================
    -- add comma to separate thousands
    -- 
    function comma_value(amount)
      local formatted = amount
      while true do  
        formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
        if (k==0) then
          break
        end
      end
      return formatted
    end

    ---============================================================
    -- rounds a number to the nearest decimal places
    --
    function round(val, decimal)
      if (decimal) then
        return math.floor( (val * 10^decimal) + 0.5) / (10^decimal)
      else
        return math.floor(val+0.5)
      end
    end

    --===================================================================
    -- given a numeric value formats output with comma to separate thousands
    -- and rounded to given decimal places
    --
    --
    function format_num(amount, decimal, prefix, neg_prefix)
      local str_amount,  formatted, famount, remain

      decimal = decimal or 2  -- default 2 decimal places
      neg_prefix = neg_prefix or "-" -- default negative sign

      famount = math.abs(round(amount,decimal))
      famount = math.floor(famount)

      remain = round(math.abs(amount) - famount, decimal)

            -- comma to separate the thousands
      formatted = comma_value(famount)

            -- attach the decimal portion
      if (decimal > 0) then
        remain = string.sub(tostring(remain),3)
        formatted = formatted .. "." .. remain ..
                    string.rep("0", decimal - string.len(remain))
      end

            -- attach prefix string e.g '$' 
      formatted = (prefix or "") .. formatted 

            -- if value is negative then format accordingly
      if (amount<0) then
        if (neg_prefix=="()") then
          formatted = "("..formatted ..")"
        else
          formatted = neg_prefix .. formatted 
        end
      end

      return formatted
    end