# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors # MIT License. See license.txt import webnotes from webnotes import _ from webnotes.utils import flt, cstr def fmt_money(amount, precision=None): """ Convert to string with commas for thousands, millions etc """ number_format = webnotes.conn.get_default("number_format") or "#,###.##" decimal_str, comma_str, precision = get_number_format_info(number_format) amount = '%.*f' % (precision, flt(amount)) if amount.find('.') == -1: decimals = '' else: decimals = amount.split('.')[1] parts = [] minus = '' if flt(amount) < 0: minus = '-' amount = cstr(abs(flt(amount))).split('.')[0] if len(amount) > 3: parts.append(amount[-3:]) amount = amount[:-3] val = number_format=="#,##,###.##" and 2 or 3 while len(amount) > val: parts.append(amount[-val:]) amount = amount[:-val] parts.append(amount) parts.reverse() amount = comma_str.join(parts) + (precision and (decimal_str + decimals) or "") amount = minus + amount return amount def get_number_format_info(format): if format=="#.###": return "", ".", 0 elif format=="#,###": return "", ",", 0 elif format=="#,###.##" or format=="#,##,###.##": return ".", ",", 2 elif format=="#.###,##": return ",", ".", 2 elif format=="# ###.##": return ".", " ", 2 else: return ".", ",", 2 import unittest class TestFmtMoney(unittest.TestCase): def test_standard(self): webnotes.conn.set_default("number_format", "#,###.##") self.assertEquals(fmt_money(100), "100.00") self.assertEquals(fmt_money(1000), "1,000.00") self.assertEquals(fmt_money(10000), "10,000.00") self.assertEquals(fmt_money(100000), "100,000.00") self.assertEquals(fmt_money(1000000), "1,000,000.00") self.assertEquals(fmt_money(10000000), "10,000,000.00") self.assertEquals(fmt_money(100000000), "100,000,000.00") self.assertEquals(fmt_money(1000000000), "1,000,000,000.00") def test_negative(self): webnotes.conn.set_default("number_format", "#,###.##") self.assertEquals(fmt_money(-100), "-100.00") self.assertEquals(fmt_money(-1000), "-1,000.00") self.assertEquals(fmt_money(-10000), "-10,000.00") self.assertEquals(fmt_money(-100000), "-100,000.00") self.assertEquals(fmt_money(-1000000), "-1,000,000.00") self.assertEquals(fmt_money(-10000000), "-10,000,000.00") self.assertEquals(fmt_money(-100000000), "-100,000,000.00") self.assertEquals(fmt_money(-1000000000), "-1,000,000,000.00") def test_decimal(self): webnotes.conn.set_default("number_format", "#.###,##") self.assertEquals(fmt_money(-100), "-100,00") self.assertEquals(fmt_money(-1000), "-1.000,00") self.assertEquals(fmt_money(-10000), "-10.000,00") self.assertEquals(fmt_money(-100000), "-100.000,00") self.assertEquals(fmt_money(-1000000), "-1.000.000,00") self.assertEquals(fmt_money(-10000000), "-10.000.000,00") self.assertEquals(fmt_money(-100000000), "-100.000.000,00") self.assertEquals(fmt_money(-1000000000), "-1.000.000.000,00") def test_lacs(self): webnotes.conn.set_default("number_format", "#,##,###.##") self.assertEquals(fmt_money(100), "100.00") self.assertEquals(fmt_money(1000), "1,000.00") self.assertEquals(fmt_money(10000), "10,000.00") self.assertEquals(fmt_money(100000), "1,00,000.00") self.assertEquals(fmt_money(1000000), "10,00,000.00") self.assertEquals(fmt_money(10000000), "1,00,00,000.00") self.assertEquals(fmt_money(100000000), "10,00,00,000.00") self.assertEquals(fmt_money(1000000000), "1,00,00,00,000.00") def test_no_precision(self): webnotes.conn.set_default("number_format", "#,###") self.assertEquals(fmt_money(0.3), "0") self.assertEquals(fmt_money(100.3), "100") self.assertEquals(fmt_money(1000.3), "1,000") self.assertEquals(fmt_money(10000.3), "10,000") self.assertEquals(fmt_money(-0.3), "0") self.assertEquals(fmt_money(-100.3), "-100") self.assertEquals(fmt_money(-1000.3), "-1,000") if __name__=="__main__": webnotes.connect() unittest.main()