diff --git a/sao/src/common.js b/sao/src/common.js index e2a098bafa..c6881719f6 100644 --- a/sao/src/common.js +++ b/sao/src/common.js @@ -2125,8 +2125,7 @@ return ''; } var digit = 0; - var factor = Number(field.factor || 1); - var string = String(value * factor); + var string = String(value); if (string.contains('e')) { var exp = string.split('e')[1]; string = string.split('e')[0]; @@ -2135,6 +2134,8 @@ if (string.contains('.')) { digit += string.replace(/0+$/, '').split('.')[1].length; } + var factor = Number(field.factor || 1); + digit -= Math.round(Math.log10(factor)); return (value * factor).toFixed(digit); }; var format_selection = function() { diff --git a/tryton/tryton/common/domain_parser.py b/tryton/tryton/common/domain_parser.py index 9b74d7c354..3252563d2b 100644 --- a/tryton/tryton/common/domain_parser.py +++ b/tryton/tryton/common/domain_parser.py @@ -5,6 +5,7 @@ import decimal import gettext import io import locale +import math from collections import OrderedDict from decimal import Decimal from shlex import shlex @@ -336,17 +337,18 @@ def format_value(field, value, target=None, context=None, _quote_empty=False): or isinstance(value, bool))): return '' digit = 0 - if isinstance(value, Decimal): - cast = Decimal - else: - cast = float - factor = cast(field.get('factor', 1)) - string_ = str(value * factor) + string_ = str(value) if 'e' in string_: string_, exp = string_.split('e') digit -= int(exp) if '.' in string_: digit += len(string_.rstrip('0').split('.')[1]) + if isinstance(value, Decimal): + cast = Decimal + else: + cast = float + factor = cast(field.get('factor', 1)) + digit -= round(math.log10(factor)) return locale.localize( '{0:.{1}f}'.format(value * factor or 0, digit), True)