diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 752543f46a..5603b2daae 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -874,7 +874,7 @@ class BaseDocument(object): return self._precision[cache_key][fieldname] - def get_formatted(self, fieldname, doc=None, currency=None, absolute_value=False, translated=False): + def get_formatted(self, fieldname, doc=None, currency=None, absolute_value=False, translated=False, format=None): from frappe.utils.formatters import format_value df = self.meta.get_field(fieldname) @@ -898,7 +898,7 @@ class BaseDocument(object): if (absolute_value or doc.get('absolute_value')) and isinstance(val, (int, float)): val = abs(self.get(fieldname)) - return format_value(val, df=df, doc=doc, currency=currency) + return format_value(val, df=df, doc=doc, currency=currency, format=format) def is_print_hide(self, fieldname, df=None, for_print=True): """Returns true if fieldname is to be hidden for print. diff --git a/frappe/tests/test_document.py b/frappe/tests/test_document.py index 7c0c95671a..68c19a8bbf 100644 --- a/frappe/tests/test_document.py +++ b/frappe/tests/test_document.py @@ -227,3 +227,28 @@ class TestDocument(unittest.TestCase): self.assertEqual(frappe.db.get_value("Currency", d.name), d.name) frappe.delete_doc_if_exists("Currency", "Frappe Coin", 1) + + def test_get_formatted(self): + frappe.get_doc({ + 'doctype': 'DocType', + 'name': 'Test Formatted', + 'module': 'Custom', + 'custom': 1, + 'fields': [ + {'label': 'Currency', 'fieldname': 'currency', 'reqd': 1, 'fieldtype': 'Currency'}, + ] + }).insert() + + frappe.delete_doc_if_exists("Currency", "INR", 1) + + d = frappe.get_doc({ + 'doctype': 'Currency', + 'currency_name': 'INR', + 'symbol': '₹', + }).insert() + + d = frappe.get_doc({ + 'doctype': 'Test Formatted', + 'currency': 100000 + }) + self.assertEquals(d.get_formatted('currency', currency='INR', format="#,###.##"), '₹ 100,000.00') \ No newline at end of file diff --git a/frappe/tests/test_fmt_money.py b/frappe/tests/test_fmt_money.py index 160ea33378..96f220447a 100644 --- a/frappe/tests/test_fmt_money.py +++ b/frappe/tests/test_fmt_money.py @@ -92,6 +92,9 @@ class TestFmtMoney(unittest.TestCase): self.assertEqual(fmt_money(1000.456), "1.000,456") frappe.db.set_default("currency_precision", "") + def test_custom_fmt_money_format(self): + self.assertEqual(fmt_money(100000, format="#,###.##"), '100,000.00') + if __name__=="__main__": frappe.connect() unittest.main() \ No newline at end of file diff --git a/frappe/tests/test_formatter.py b/frappe/tests/test_formatter.py index 5257e1c717..5454c2b1cd 100644 --- a/frappe/tests/test_formatter.py +++ b/frappe/tests/test_formatter.py @@ -17,9 +17,9 @@ class TestFormatter(unittest.TestCase): frappe.db.set_default("currency", 'INR') # if currency field is not passed then default currency should be used. - self.assertEqual(format(100, df, doc), '₹ 100.00') + self.assertEqual(format(100000, df, doc, format="#,###.##"), '₹ 100,000.00') doc.currency = 'USD' - self.assertEqual(format(100, df, doc), "$ 100.00") + self.assertEqual(format(100000, df, doc, format="#,###.##"), "$ 100,000.00") frappe.db.set_default("currency", None) \ No newline at end of file diff --git a/frappe/utils/formatters.py b/frappe/utils/formatters.py index 9efccc15f0..cca2b4f1ba 100644 --- a/frappe/utils/formatters.py +++ b/frappe/utils/formatters.py @@ -7,7 +7,7 @@ from frappe.utils import formatdate, fmt_money, flt, cstr, cint, format_datetime from frappe.model.meta import get_field_currency, get_field_precision import re -def format_value(value, df=None, doc=None, currency=None, translated=False): +def format_value(value, df=None, doc=None, currency=None, translated=False, format=None): '''Format value based on given fieldtype, document reference, currency reference. If docfield info (df) is not given, it will try and guess based on the datatype of the value''' if isinstance(df, str): @@ -56,7 +56,7 @@ def format_value(value, df=None, doc=None, currency=None, translated=False): elif df.get("fieldtype") == "Currency": default_currency = frappe.db.get_default("currency") currency = currency or get_field_currency(df, doc) or default_currency - return fmt_money(value, precision=get_field_precision(df, doc), currency=currency) + return fmt_money(value, precision=get_field_precision(df, doc), currency=currency, format=format) elif df.get("fieldtype") == "Float": precision = get_field_precision(df, doc)