Formatting Numbers

lua-users home
wiki

Showing revision 18
fuck off 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
US$1,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('US$1333400'))
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
US$1,333,400
-$22,333,444.56
($22,333,444.56)
NEG $22,333,444.563

RecentChanges · preferences
edit · history · current revision
Edited August 21, 2018 5:20 am GMT (diff)