From fc8ab0df051d15d8d3731108c87c4cdc483e12c0 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 22 Oct 2013 10:54:36 +0200 Subject: [PATCH] [FIX] numbers formatting to correctly apply user locales bzr revid: xmo@openerp.com-20131022085436-5845r3q51g9pl2ct --- openerp/addons/base/ir/ir_qweb.py | 13 ++++++++++--- .../tests/addons/test_converter/tests/test_html.py | 9 +++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) 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')