From d01ba3c051413c2119cafcf1421e9a604389a1e4 Mon Sep 17 00:00:00 2001 From: Achilles Rasquinha Date: Wed, 6 Dec 2017 14:15:18 +0530 Subject: [PATCH] Fixed Currency Precision during Display and Print (#4579) * Fixed Currency Issue for Display and Print * Fixed Codacy * Update formatters.js --- frappe/public/js/frappe/form/formatters.js | 27 +++++++++++----------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/frappe/public/js/frappe/form/formatters.js b/frappe/public/js/frappe/form/formatters.js index 64147dfc03..ae0aad8218 100644 --- a/frappe/public/js/frappe/form/formatters.js +++ b/frappe/public/js/frappe/form/formatters.js @@ -50,23 +50,24 @@ frappe.form.formatters = { Percent: function(value, docfield, options) { return frappe.form.formatters._right(flt(value, 2) + "%", options) }, - Currency: function(value, docfield, options, doc) { - var currency = frappe.meta.get_field_currency(docfield, doc); + Currency: function (value, docfield, options, doc) { + var currency = frappe.meta.get_field_currency(docfield, doc); var precision = docfield.precision || cint(frappe.boot.sysdefaults.currency_precision) || 2; + + // If you change anything below, it's going to hurt a company in UAE, a bit. if (precision > 2) { - let parts = cstr(value).split('.'); - let decimals = parts.length > 1 ? parts[1] : ''; - if (decimals.length < 3) { - // min precision 2 - precision = 2; - } else if (decimals.length < precision) { - // or min decimals - precision = decimals.length; + var parts = cstr(value).split("."); // should be minimum 2, comes from the DB + var decimals = parts.length > 1 ? parts[1] : ""; // parts.length == 2 ??? + + if ( decimals.length < 3 || decimals.length < precision ) { + const fraction = frappe.model.get_value(":Currency", currency, "fraction_units") || 100; // if not set, minimum 2. + precision = cstr(fraction).length - 1; } } - value = (value==null || value==="") ? - "" : format_currency(value, currency, precision); - if (options && options.only_value) { + + value = (value == null || value == "") ? "" : format_currency(value, currency, precision); + + if ( options && options.only_value ) { return value; } else { return frappe.form.formatters._right(value, options);