diff --git a/webnotes/utils/__init__.py b/webnotes/utils/__init__.py index d6d637674b..a53ffeaf27 100644 --- a/webnotes/utils/__init__.py +++ b/webnotes/utils/__init__.py @@ -407,39 +407,76 @@ def parse_val(v): return v # ============================================================================== - -def fmt_money(amount, decimal_fmt="%02.d"): +# +# def fmt_money(amount, decimal_fmt="%02.d"): +# """ +# Convert to string with commas for thousands, millions etc +# """ +# currency_format = webnotes.conn.get_value('Control Panel', None, 'currency_format') \ +# or 'Millions' +# comma_frequency = (currency_format == "Millions") and 3 or 2 +# minus = flt(amount) < 0 and "-" or "" +# +# # get whole and fraction parts +# str_amount = cstr(amount) +# if "." in str_amount: +# amount_whole = abs(cint(str_amount.split(".")[0])) +# amount_fraction = cint(str_amount.split(".")[1]) +# else: +# amount_whole = abs(cint(str_amount)) +# amount_fraction = 0 +# +# # reverse the whole part, so that it is easy to append commas +# whole_reversed = cstr(amount_whole)[::-1] +# whole_with_comma = whole_reversed[:3] +# if len(whole_reversed) > 3: +# remaining_str = whole_reversed[3:] +# for i in xrange(len(remaining_str)): +# # insert a comma after the specified frequency of digits +# if i%comma_frequency==0: +# whole_with_comma += "," +# whole_with_comma += remaining_str[i] +# # reverse the whole part again to get the original number back! +# whole_with_comma = whole_with_comma[::-1] +# webnotes.msgprint(decimal_fmt) +# webnotes.msgprint(("%s%s."+decimal_fmt) % (minus, whole_with_comma, amount_fraction)) +# return ("%s%s."+decimal_fmt) % (minus, whole_with_comma, amount_fraction) + + +def fmt_money(amount, precision=2): """ Convert to string with commas for thousands, millions etc """ - currency_format = webnotes.conn.get_value('Control Panel', None, 'currency_format') \ - or 'Millions' - comma_frequency = (currency_format == "Millions") and 3 or 2 - minus = flt(amount) < 0 and "-" or "" + curr = webnotes.conn.get_value('Control Panel', None, 'currency_format') or 'Millions' + amount = '%.*f' % (precision, flt(amount)) + val = 2 + if curr == 'Millions': val = 3 - # get whole and fraction parts - str_amount = cstr(amount) - if "." in str_amount: - amount_whole = abs(cint(str_amount.split(".")[0])) - amount_fraction = cint(str_amount.split(".")[1]) - else: - amount_whole = abs(cint(str_amount)) - amount_fraction = 0 - - # reverse the whole part, so that it is easy to append commas - whole_reversed = cstr(amount_whole)[::-1] - whole_with_comma = whole_reversed[:3] - if len(whole_reversed) > 3: - remaining_str = whole_reversed[3:] - for i in xrange(len(remaining_str)): - # insert a comma after the specified frequency of digits - if i%comma_frequency==0: - whole_with_comma += "," - whole_with_comma += remaining_str[i] - # reverse the whole part again to get the original number back! - whole_with_comma = whole_with_comma[::-1] - - return ("%s%s."+decimal_fmt) % (minus, whole_with_comma, amount_fraction) + if amount.find('.') == -1: temp = '00' + else: temp = amount.split('.')[1] + + l = [] + minus = '' + if flt(amount) < 0: minus = '-' + + amount = ''.join(amount.split(',')) + amount = cstr(abs(flt(amount))).split('.')[0] + + # main logic + if len(amount) > 3: + nn = amount[len(amount)-3:] + l.append(nn) + amount = amount[0:len(amount)-3] + while len(amount) > val: + nn = amount[len(amount)-val:] + l.insert(0,nn) + amount = amount[0:len(amount)-val] + + if len(amount) > 0: l.insert(0,amount) + + amount = ','.join(l)+'.'+temp + amount = minus + amount + return amount # # convet currency to words