From fcc672315f4d1ac14d8f8eb6f75eb9000000ec14 Mon Sep 17 00:00:00 2001 From: Safwan <62411302+safwansamsudeen@users.noreply.github.com> Date: Mon, 2 Mar 2026 11:46:06 +0530 Subject: [PATCH] fix: make percent precision dynamic (#37523) --- frappe/public/js/frappe/form/controls/control.js | 1 + frappe/public/js/frappe/form/controls/float.js | 2 -- frappe/public/js/frappe/form/controls/percent.js | 13 +++++++++++++ frappe/public/js/frappe/form/formatters.js | 7 +++++-- 4 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 frappe/public/js/frappe/form/controls/percent.js diff --git a/frappe/public/js/frappe/form/controls/control.js b/frappe/public/js/frappe/form/controls/control.js index e5c69b6431..615911c0ee 100644 --- a/frappe/public/js/frappe/form/controls/control.js +++ b/frappe/public/js/frappe/form/controls/control.js @@ -3,6 +3,7 @@ import "./base_input"; import "./data"; import "./int"; import "./float"; +import "./percent"; import "./currency"; import "./date"; import "./time"; diff --git a/frappe/public/js/frappe/form/controls/float.js b/frappe/public/js/frappe/form/controls/float.js index 26f5b64ca2..8a0e527c3b 100644 --- a/frappe/public/js/frappe/form/controls/float.js +++ b/frappe/public/js/frappe/form/controls/float.js @@ -32,5 +32,3 @@ frappe.ui.form.ControlFloat = class ControlFloat extends frappe.ui.form.ControlI return this.df.precision || cint(frappe.boot.sysdefaults.float_precision, null); } }; - -frappe.ui.form.ControlPercent = frappe.ui.form.ControlFloat; diff --git a/frappe/public/js/frappe/form/controls/percent.js b/frappe/public/js/frappe/form/controls/percent.js new file mode 100644 index 0000000000..e5f3ae2d48 --- /dev/null +++ b/frappe/public/js/frappe/form/controls/percent.js @@ -0,0 +1,13 @@ +frappe.ui.form.ControlPercent = class ControlPercent extends frappe.ui.form.ControlFloat { + format_for_input(value) { + if (value === null || value === undefined || isNaN(Number(value))) { + return ""; + } + const precision = value.toString().split(".")[1]?.length || 0; + return format_number( + value, + this.get_number_format(), + Math.min(this.get_precision(), precision) + ); + } +}; diff --git a/frappe/public/js/frappe/form/formatters.js b/frappe/public/js/frappe/form/formatters.js index dc1c7a5fe2..bb29b50fa5 100644 --- a/frappe/public/js/frappe/form/formatters.js +++ b/frappe/public/js/frappe/form/formatters.js @@ -94,12 +94,15 @@ frappe.form.formatters = { if (value === null) { return ""; } - + const valuePrecision = value.toString().split(".")[1]?.length || 0; const precision = docfield.precision || cint(frappe.boot.sysdefaults && frappe.boot.sysdefaults.float_precision) || 2; - return frappe.form.formatters._right(format_number(value, null, precision) + "%", options); + return frappe.form.formatters._right( + format_number(value, null, Math.min(precision, valuePrecision)) + "%", + options + ); }, Rating: function (value, docfield) { let rating_html = "";