Add monetary formatting to language

issue6927
review38921002
This commit is contained in:
Cédric Krier
2017-11-25 22:11:52 +01:00
parent 473ac78eb4
commit 437d7e3eaf
5 changed files with 309 additions and 24 deletions
+1
View File
@@ -1,3 +1,4 @@
* Add monetary formatting to language
* Add exceptional parent language
* Add get method on ir.lang
* Convert format, currency and strftime of ir.lang into instance methods
+11
View File
@@ -14,6 +14,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">.</field>
<field name="thousands_sep">,</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">.</field>
<field name="mon_thousands_sep">,</field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="True"/>
<field name="n_cs_precedes" eval="True"/>
<field name="p_sep_by_space" eval="False"/>
<field name="n_sep_by_space" eval="False"/>
</record>
<menuitem name="Administration" id="menu_administration"
+81 -22
View File
@@ -48,6 +48,19 @@ class Lang(ModelSQL, ModelView):
decimal_point = fields.Char('Decimal Separator', required=True)
thousands_sep = fields.Char('Thousands Separator')
# monetary formatting
mon_grouping = fields.Char('Grouping', required=True)
mon_decimal_point = fields.Char('Decimal Separator', required=True)
mon_thousands_sep = fields.Char('Thousands Separator')
p_sign_posn = fields.Integer('Positive Sign Position', required=True)
n_sign_posn = fields.Integer('Negative Sign Position', required=True)
positive_sign = fields.Char('Positive Sign')
negative_sign = fields.Char('Negative Sign')
p_cs_precedes = fields.Boolean('Positive Currency Symbol Precedes')
n_cs_precedes = fields.Boolean('Negative Currency Symbol Precedes')
p_sep_by_space = fields.Boolean('Positive Separate by Space')
n_sep_by_space = fields.Boolean('Negative Separate by Space')
_lang_cache = Cache('ir.lang')
_code_cache = Cache('ir.lang.code', context=False)
@@ -129,6 +142,50 @@ class Lang(ModelSQL, ModelView):
def default_thousands_sep():
return ','
@classmethod
def default_mon_grouping(cls):
return '[]'
@classmethod
def default_mon_thousands_sep(cls):
return ','
@classmethod
def default_mon_decimal_point(cls):
return '.'
@classmethod
def default_p_sign_posn(cls):
return 1
@classmethod
def default_n_sign_posn(cls):
return 1
@classmethod
def default_negative_sign(cls):
return '-'
@classmethod
def default_positive_sign(cls):
return ''
@classmethod
def default_p_cs_precedes(cls):
return True
@classmethod
def default_n_cs_precedes(cls):
return True
@classmethod
def default_p_sep_by_space(cls):
return False
@classmethod
def default_n_sep_by_space(cls):
return False
@classmethod
def validate(cls, languages):
super(Lang, cls).validate(languages)
@@ -142,16 +199,17 @@ class Lang(ModelSQL, ModelView):
Check if grouping is list of numbers
'''
for lang in langs:
try:
grouping = literal_eval(lang.grouping)
for i in grouping:
if not isinstance(i, int):
raise
except Exception:
cls.raise_user_error('invalid_grouping', {
'grouping': lang.grouping,
'language': lang.rec_name,
})
for grouping in [lang.grouping, lang.mon_grouping]:
try:
grouping = literal_eval(grouping)
for i in grouping:
if not isinstance(i, int):
raise
except Exception:
cls.raise_user_error('invalid_grouping', {
'grouping': grouping,
'language': lang.rec_name,
})
@classmethod
def check_date(cls, langs):
@@ -268,7 +326,7 @@ class Lang(ModelSQL, ModelView):
lang = cls(lang_id)
return lang
def _group(self, s, monetary=None):
def _group(self, s, monetary=False):
# Code from _group in locale.py
# Iterate over grouping intervals
@@ -286,8 +344,8 @@ class Lang(ModelSQL, ModelView):
last_interval = interval
if monetary:
thousands_sep = monetary.mon_thousands_sep
grouping = literal_eval(monetary.mon_grouping)
thousands_sep = self.mon_thousands_sep
grouping = literal_eval(self.mon_grouping)
else:
thousands_sep = self.thousands_sep
grouping = literal_eval(self.grouping)
@@ -317,7 +375,7 @@ class Lang(ModelSQL, ModelView):
len(thousands_sep) * (len(groups) - 1)
)
def format(self, percent, value, grouping=False, monetary=None,
def format(self, percent, value, grouping=False, monetary=False,
*additional):
'''
Returns the lang-aware substitution of a %? specifier (percent).
@@ -352,7 +410,7 @@ class Lang(ModelSQL, ModelView):
if grouping:
parts[0], seps = self._group(parts[0], monetary=monetary)
if monetary:
decimal_point = monetary.mon_decimal_point
decimal_point = self.mon_decimal_point
else:
decimal_point = self.decimal_point
formatted = decimal_point.join(parts)
@@ -370,6 +428,7 @@ class Lang(ModelSQL, ModelView):
Formats val according to the currency settings in lang.
"""
# Code from currency in locale.py
# check for illegal values
digits = currency.digits
if digits == 127:
@@ -377,25 +436,25 @@ class Lang(ModelSQL, ModelView):
"the 'C' locale.")
s = self.format(
'%%.%if' % digits, abs(val), grouping, monetary=currency)
'%%.%if' % digits, abs(val), grouping, monetary=True)
# '<' and '>' are markers if the sign must be inserted
# between symbol and value
s = '<' + s + '>'
if symbol:
smb = currency.symbol
precedes = (val < 0 and currency.n_cs_precedes
or currency.p_cs_precedes)
separated = (val < 0 and currency.n_sep_by_space
or currency.p_sep_by_space)
precedes = (val < 0 and self.n_cs_precedes
or self.p_cs_precedes)
separated = (val < 0 and self.n_sep_by_space
or self.p_sep_by_space)
if precedes:
s = smb + (separated and ' ' or '') + s
else:
s = s + (separated and ' ' or '') + smb
sign_pos = val < 0 and currency.n_sign_posn or currency.p_sign_posn
sign = val < 0 and currency.negative_sign or currency.positive_sign
sign_pos = val < 0 and self.n_sign_posn or self.p_sign_posn
sign = val < 0 and self.negative_sign or self.positive_sign
if sign_pos == 0:
s = '(' + s + ')'
+189 -2
View File
@@ -12,6 +12,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep">.</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep"> </field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_ca">
<field name="code">ca</field>
@@ -20,6 +31,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep"> </field>
<field name="mon_grouping">[]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep">.</field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="True"/>
<field name="n_cs_precedes" eval="True"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_cs">
<field name="code">cs</field>
@@ -28,6 +50,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep"> </field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep"> </field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_de">
<field name="code">de</field>
@@ -36,6 +69,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep">.</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep">.</field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<!--
lang_en is defined in ir.xml
@@ -47,14 +91,36 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep">.</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep">.</field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_es_419">
<field name="code">es_419</field>
<field name="name">Spanish (Latin American)</field>
<field name="date">%d/%m/%Y</field>
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep">.</field>
<field name="decimal_point">.</field>
<field name="thousands_sep">,</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">.</field>
<field name="mon_thousands_sep">,</field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_fr">
<field name="code">fr</field>
@@ -63,6 +129,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep"> </field>
<field name="mon_grouping">[3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep"> </field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_hu_HU">
<field name="code">hu_HU</field>
@@ -71,6 +148,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep">.</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep">.</field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_it_IT">
<field name="code">it_IT</field>
@@ -79,6 +167,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep">.</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep">.</field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="True"/>
<field name="n_cs_precedes" eval="True"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_lo">
<field name="code">lo</field>
@@ -87,6 +186,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">.</field>
<field name="thousands_sep">,</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">.</field>
<field name="mon_thousands_sep">,</field>
<field name="p_sign_posn">4</field>
<field name="n_sign_posn">4</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="True"/>
<field name="n_cs_precedes" eval="True"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_lt">
<field name="code">lt</field>
@@ -95,6 +205,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep"> </field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep">.</field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_nl">
<field name="code">nl</field>
@@ -103,6 +224,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep">.</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep"> </field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">2</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="True"/>
<field name="n_cs_precedes" eval="True"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_pl">
<field name="code">pl</field>
@@ -110,6 +242,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="date">%d.%m.%Y</field>
<field name="decimal_point">,</field>
<field name="thousands_sep"></field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep">.</field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_pt_BR">
<field name="code">pt_BR</field>
@@ -118,6 +261,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep">.</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep">.</field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="True"/>
<field name="n_cs_precedes" eval="True"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_ru">
<field name="code">ru</field>
@@ -126,6 +280,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep"> </field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">.</field>
<field name="mon_thousands_sep"> </field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_sl">
<field name="code">sl</field>
@@ -134,6 +299,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 3, 0]</field>
<field name="decimal_point">,</field>
<field name="thousands_sep">.</field>
<field name="mon_grouping">[3, 3, 0]</field>
<field name="mon_decimal_point">,</field>
<field name="mon_thousands_sep"> </field>
<field name="p_sign_posn">1</field>
<field name="n_sign_posn">1</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="False"/>
<field name="n_cs_precedes" eval="False"/>
<field name="p_sep_by_space" eval="True"/>
<field name="n_sep_by_space" eval="True"/>
</record>
<record model="ir.lang" id="lang_zh_CN">
<field name="code">zh_CN</field>
@@ -142,6 +318,17 @@ this repository contains the full copyright notices and license terms. -->
<field name="grouping">[3, 0]</field>
<field name="decimal_point">.</field>
<field name="thousands_sep">,</field>
<field name="mon_grouping">[3, 0]</field>
<field name="mon_decimal_point">.</field>
<field name="mon_thousands_sep">,</field>
<field name="p_sign_posn">4</field>
<field name="n_sign_posn">4</field>
<field name="positive_sign"></field>
<field name="negative_sign">-</field>
<field name="p_cs_precedes" eval="True"/>
<field name="n_cs_precedes" eval="True"/>
<field name="p_sep_by_space" eval="False"/>
<field name="n_sep_by_space" eval="False"/>
</record>
<record model="ir.ui.view" id="lang_view_tree">
+27
View File
@@ -24,4 +24,31 @@ this repository contains the full copyright notices and license terms. -->
<field name="thousands_sep"/>
<label name="decimal_point"/>
<field name="decimal_point"/>
<separator string="Monetary Formatting" colspan="6" id="monetary"/>
<label name="mon_grouping"/>
<field name="mon_grouping"/>
<label name="mon_thousands_sep"/>
<field name="mon_thousands_sep"/>
<label name="mon_decimal_point"/>
<field name="mon_decimal_point"/>
<newline/>
<label name="positive_sign"/>
<field name="positive_sign"/>
<label name="negative_sign"/>
<field name="negative_sign"/>
<newline/>
<label name="p_sign_posn"/>
<field name="p_sign_posn"/>
<label name="n_sign_posn"/>
<field name="n_sign_posn"/>
<newline/>
<label name="p_cs_precedes"/>
<field name="p_cs_precedes"/>
<label name="n_cs_precedes"/>
<field name="n_cs_precedes"/>
<newline/>
<label name="p_sep_by_space"/>
<field name="p_sep_by_space"/>
<label name="n_sep_by_space"/>
<field name="n_sep_by_space"/>
</form>