changeset 9ca2feb6cc84 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=9ca2feb6cc84
description:
        Add methods to format number and symbol on Lang

        and add format number with symbol on Report

        issue10730
        review371831002
diffstat:

 CHANGELOG                |   2 ++
 trytond/ir/lang.py       |  21 +++++++++++++++++++++
 trytond/report/report.py |  24 +++++++++++++++---------
 trytond/tests/test_ir.py |  34 ++++++++++++++++++++++++++++++++++
 4 files changed, 72 insertions(+), 9 deletions(-)

diffs (146 lines):

diff -r 00853e6a6030 -r 9ca2feb6cc84 CHANGELOG
--- a/CHANGELOG Sun Oct 03 13:50:33 2021 +0200
+++ b/CHANGELOG Mon Oct 04 18:52:01 2021 +0200
@@ -1,3 +1,5 @@
+* Add methods to format number and symbol on Lang
+* Add format number with symbol on Report
 * Allow locking tables by calling ModelSQL.lock without records
 * Add test on domain of relation fields
 * Add stored path as alternative to MPTT
diff -r 00853e6a6030 -r 9ca2feb6cc84 trytond/ir/lang.py
--- a/trytond/ir/lang.py        Sun Oct 03 13:50:33 2021 +0200
+++ b/trytond/ir/lang.py        Mon Oct 04 18:52:01 2021 +0200
@@ -5,6 +5,7 @@
 from locale import CHAR_MAX
 from ast import literal_eval
 
+from decimal import Decimal
 from sql import Table
 
 from trytond.cache import Cache
@@ -552,6 +553,26 @@
             format = format.replace('%p', p)
         return value.strftime(format)
 
+    def format_number(self, value, digits=None, grouping=True, monetary=None):
+        if digits is None:
+            d = value
+            if not isinstance(d, Decimal):
+                d = Decimal(repr(value))
+            digits = -int(d.as_tuple().exponent)
+        return self.format(
+            '%.*f', (digits, value), grouping=grouping, monetary=monetary)
+
+    def format_number_symbol(self, value, symbol, digits=None, grouping=True):
+        symbol, position = symbol.get_symbol(value)
+        separated = (
+            value < 0 and self.n_sep_by_space or self.p_sep_by_space)
+        s = self.format_number(value, digits, grouping)
+        if position:
+            s = s + (separated and ' ' or '') + symbol
+        else:
+            s = symbol + (separated and ' ' or '') + s
+        return s
+
 
 class LangConfigStart(ModelView):
     "Configure languages"
diff -r 00853e6a6030 -r 9ca2feb6cc84 trytond/report/report.py
--- a/trytond/report/report.py  Sun Oct 03 13:50:33 2021 +0200
+++ b/trytond/report/report.py  Mon Oct 04 18:52:01 2021 +0200
@@ -13,7 +13,6 @@
 import zipfile
 import operator
 
-from decimal import Decimal
 from email.mime.multipart import MIMEMultipart
 from email.mime.text import MIMEText
 from io import BytesIO
@@ -288,6 +287,7 @@
         report_context['format_timedelta'] = cls.format_timedelta
         report_context['format_currency'] = cls.format_currency
         report_context['format_number'] = cls.format_number
+        report_context['format_number_symbol'] = cls.format_number_symbol
         report_context['datetime'] = datetime
 
         def set_lang(language=None):
@@ -445,7 +445,8 @@
         Lang = pool.get('ir.lang')
         if lang is None:
             lang = Lang.get()
-        return lang.currency(value, currency, symbol, grouping, digits=digits)
+        return lang.currency(
+            value, currency, symbol=symbol, grouping=grouping, digits=digits)
 
     @classmethod
     def format_number(
@@ -454,13 +455,18 @@
         Lang = pool.get('ir.lang')
         if lang is None:
             lang = Lang.get()
-        if digits is None:
-            d = value
-            if not isinstance(d, Decimal):
-                d = Decimal(repr(value))
-            digits = -int(d.as_tuple().exponent)
-        return lang.format('%.' + str(digits) + 'f', value,
-            grouping=grouping, monetary=monetary)
+        return lang.format_number(
+            value, digits=digits, grouping=grouping, monetary=monetary)
+
+    @classmethod
+    def format_number_symbol(
+            cls, value, lang, symbol, digits=None, grouping=True):
+        pool = Pool()
+        Lang = pool.get('ir.lang')
+        if lang is None:
+            lang = Lang.get()
+        return lang.format_number_symbol(
+            value, symbol, digits=digits, grouping=grouping)
 
 
 def get_email(report, record, languages):
diff -r 00853e6a6030 -r 9ca2feb6cc84 trytond/tests/test_ir.py
--- a/trytond/tests/test_ir.py  Sun Oct 03 13:50:33 2021 +0200
+++ b/trytond/tests/test_ir.py  Mon Oct 04 18:52:01 2021 +0200
@@ -170,6 +170,40 @@
             self.assertEqual(lang.strftime(date, format_), result)
 
     @with_transaction()
+    def test_lang_format_number(self):
+        "Test Lang.format_number"
+        pool = Pool()
+        Lang = pool.get('ir.lang')
+        lang = Lang.get('en')
+        test_data = [
+            (Decimal('10.50'), False, None, '10.50'),
+            (Decimal('10.50'), False, 4, '10.5000'),
+            (Decimal('1000.50'), True, 4, '1,000.5000'),
+            ]
+        for value, grouping, digits, result in test_data:
+            self.assertEqual(
+                lang.format_number(value, digits, grouping), result)
+
+    @with_transaction()
+    def test_lang_format_number_symbol(self):
+        "Test Lang.format_number_symbol"
+        pool = Pool()
+        Lang = pool.get('ir.lang')
+        lang = Lang.get('en')
+        unit = Mock()
+        unit.symbol = 'Kg'
+        unit.get_symbol = Mock()
+        unit.get_symbol.return_value = 'Kg', 1
+        test_data = [
+            (Decimal('10.50'), False, None, '10.50Kg'),
+            (Decimal('1000.50'), True, 4, '1,000.5000Kg'),
+            ]
+        for value, grouping, digits, result in test_data:
+            self.assertEqual(
+                lang.format_number_symbol(value, unit, digits, grouping),
+                result)
+
+    @with_transaction()
     def test_model_data_get_id(self):
         "Test ModelData.get_id"
         pool = Pool()

Reply via email to