diff --git a/openerp/addons/base/ir/ir_qweb.py b/openerp/addons/base/ir/ir_qweb.py index 866e97a4e85..3cafdbbe526 100644 --- a/openerp/addons/base/ir/ir_qweb.py +++ b/openerp/addons/base/ir/ir_qweb.py @@ -587,12 +587,19 @@ class FloatConverter(osv.AbstractModel): def value_to_html(self, cr, uid, value, column, options=None, context=None): precision = self.precision(cr, uid, column, options=options, context=context) - fmt = '%s' if precision is None else '%.{precision}f' + fmt = '%f' if precision is None else '%.{precision}f' lang = self.user_lang(cr, uid, context) - return werkzeug.utils.escape( - lang.format(fmt.format(precision=precision), value, grouping=True)) + formatted = lang.format(fmt.format(precision=precision), + value, grouping=True) + # %f does not strip trailing zeroes. %g does but its precision causes + # it to switch to scientific notation starting at a million *and* to + # strip decimals. So use %f and if no precision was specified manually + # strip trailing 0. + if not precision: + formatted = re.sub(r'(?:(0|\d+?)0+)$', r'\1', formatted) + return werkzeug.utils.escape(formatted) class DateConverter(osv.AbstractModel): _name = 'ir.qweb.field.date' diff --git a/openerp/tests/addons/test_converter/tests/test_html.py b/openerp/tests/addons/test_converter/tests/test_html.py index 08e6ee96b62..6d1f1cd9a56 100644 --- a/openerp/tests/addons/test_converter/tests/test_html.py +++ b/openerp/tests/addons/test_converter/tests/test_html.py @@ -53,6 +53,12 @@ class TestIntegerExport(TestBasicExport): self.assertEqual(value, "42") class TestFloatExport(TestBasicExport): + def setUp(self): + super(TestFloatExport, self).setUp() + self.registry('res.lang').write(self.cr, self.uid, [1], { + 'grouping': '[3,0]' + }) + def test_float(self): converter = self.get_converter('float') @@ -65,6 +71,9 @@ class TestFloatExport(TestBasicExport): value = converter(42.01234) self.assertEqual(value, "42.01234") + value = converter(1234567.89) + self.assertEqual(value, '1,234,567.89') + def test_numeric(self): converter = self.get_converter('numeric')