Formatting Numbers


The following implementation provides a function 'format_num' that allows one to format numbers as monetary values, e.g 12000000 as 12,000,000ドル.00. This can be useful to format numeric values in reports.

Alternative code further down.

-- 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

Example usage:

amount = 1333444.1
print(format_num(amount,2))
print(format_num(amount,-2,"US$"))
amount = -22333444.5634
print(format_num(amount,2,"$"))
print(format_num(amount,2,"$","()"))
print(format_num(amount,3,"$","NEG "))

Output:

1,333,444.10
US1,333,400ドル
-22,333,444ドル.56
(22,333,444ドル.56)
NEG 22,333,444ドル.563

RichardWarburton alternate version:

function comma_value(n) -- credit http://richard.warburton.it
	local left,num,right = string.match(n,'^([^%d]*%d)(%d*)(.-)$')
	return left..(num:reverse():gsub('(%d%d%d)','%1,'):reverse())..right
end

Example usage:

print(comma_value(9))
print(comma_value(999))
print(comma_value(1000))
print(comma_value('1333444.10'))
print(comma_value('US1333400ドル'))
print(comma_value('-22333444ドル.56'))
print(comma_value('(22333444ドル.56)'))
print(comma_value('NEG 22333444ドル.563'))

Output:

9
999
1,000
1,333,444.10
US1,333,400ドル
-22,333,444ドル.56
(22,333,444ドル.56)
NEG 22,333,444ドル.563

RecentChanges · preferences
edit · history
Last edited August 23, 2018 7:12 am GMT (diff)

AltStyle によって変換されたページ (->オリジナル) /