From 49eb6b10cd2f62cd2e00efb6e71a567753948ff8 Mon Sep 17 00:00:00 2001 From: Vinicius Pacheco Date: Sat, 17 Dec 2016 16:02:15 -0300 Subject: [PATCH 1/5] Add more documentation on numbers docstring --- babel/numbers.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/babel/numbers.py b/babel/numbers.py index a5d30ef26..d81d6733e 100644 --- a/babel/numbers.py +++ b/babel/numbers.py @@ -352,6 +352,14 @@ def format_percent(number, format=None, locale=LC_NUMERIC): >>> format_percent(25.1234, u'#,##0\u2030', locale='en_US') u'25,123\u2030' + The format pattern with percent or per mille signal, can also change the precision: + + >>> format_percent(0.346, locale='en_US') + u'35%' + + >>> format_percent(0.346, u'###.##%', locale='en_US') + u'34.6' + :param number: the percent number to format :param format: :param locale: the `Locale` object or locale identifier @@ -617,7 +625,8 @@ def apply(self, value, locale, currency=None, force_frac=None): retval = retval.replace(u'¤¤¤', get_currency_name(currency, value, locale)) retval = retval.replace(u'¤¤', currency.upper()) - retval = retval.replace(u'¤', get_currency_symbol(currency, locale)) + retval = retval.replace( + u'¤', get_currency_symbol(currency, locale)) return retval # From 857a3940e182a7eeacbb4c88168deee793dfca50 Mon Sep 17 00:00:00 2001 From: Vinicius Pacheco Date: Sat, 17 Dec 2016 16:08:52 -0300 Subject: [PATCH 2/5] Revert "Add more documentation on numbers docstring" This reverts commit 49eb6b10cd2f62cd2e00efb6e71a567753948ff8. --- babel/numbers.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/babel/numbers.py b/babel/numbers.py index d81d6733e..a5d30ef26 100644 --- a/babel/numbers.py +++ b/babel/numbers.py @@ -352,14 +352,6 @@ def format_percent(number, format=None, locale=LC_NUMERIC): >>> format_percent(25.1234, u'#,##0\u2030', locale='en_US') u'25,123\u2030' - The format pattern with percent or per mille signal, can also change the precision: - - >>> format_percent(0.346, locale='en_US') - u'35%' - - >>> format_percent(0.346, u'###.##%', locale='en_US') - u'34.6' - :param number: the percent number to format :param format: :param locale: the `Locale` object or locale identifier @@ -625,8 +617,7 @@ def apply(self, value, locale, currency=None, force_frac=None): retval = retval.replace(u'¤¤¤', get_currency_name(currency, value, locale)) retval = retval.replace(u'¤¤', currency.upper()) - retval = retval.replace( - u'¤', get_currency_symbol(currency, locale)) + retval = retval.replace(u'¤', get_currency_symbol(currency, locale)) return retval # From 721fb06c34e7d6e86782b4d18cb48b0eaff1775d Mon Sep 17 00:00:00 2001 From: Vinicius Pacheco Date: Sat, 17 Dec 2016 16:23:25 -0300 Subject: [PATCH 3/5] Add more documentation on numbers docstring --- babel/numbers.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/babel/numbers.py b/babel/numbers.py index a5d30ef26..5e1aa389e 100644 --- a/babel/numbers.py +++ b/babel/numbers.py @@ -352,6 +352,14 @@ def format_percent(number, format=None, locale=LC_NUMERIC): >>> format_percent(25.1234, u'#,##0\u2030', locale='en_US') u'25,123\u2030' + The format pattern with percent or per mille symbol change the precision: + + >>> format_percent(0.346, locale='en_US') + u'35%' + + >>> format_percent(0.346, u'#,###.##%', locale='en_US') + u'34.6%' + :param number: the percent number to format :param format: :param locale: the `Locale` object or locale identifier @@ -617,7 +625,8 @@ def apply(self, value, locale, currency=None, force_frac=None): retval = retval.replace(u'¤¤¤', get_currency_name(currency, value, locale)) retval = retval.replace(u'¤¤', currency.upper()) - retval = retval.replace(u'¤', get_currency_symbol(currency, locale)) + retval = retval.replace( + u'¤', get_currency_symbol(currency, locale)) return retval # From 163cf89926083c65d29380777fecee255082a2cb Mon Sep 17 00:00:00 2001 From: Vinicius Pacheco Date: Tue, 27 Dec 2016 00:38:17 -0300 Subject: [PATCH 4/5] Add scale parameter on format_percent --- babel/numbers.py | 20 ++++++++++++++++++-- tests/test_numbers.py | 16 +++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/babel/numbers.py b/babel/numbers.py index 5e1aa389e..e4261de48 100644 --- a/babel/numbers.py +++ b/babel/numbers.py @@ -337,7 +337,7 @@ def format_currency(number, currency, format=None, locale=LC_NUMERIC, return pattern.apply(number, locale, currency=currency, force_frac=frac) -def format_percent(number, format=None, locale=LC_NUMERIC): +def format_percent(number, format=None, locale=LC_NUMERIC, scale=None): """Return formatted percent value for a specific locale. >>> format_percent(0.34, locale='en_US') @@ -346,6 +346,10 @@ def format_percent(number, format=None, locale=LC_NUMERIC): u'2,512%' >>> format_percent(25.1234, locale='sv_SE') u'2\\xa0512\\xa0%' + + You can set the percent precision changing the scale + >>> format_percent(0.345, locale='en_US', scale=2) + u'34.50%' The format pattern can also be specified explicitly: @@ -360,15 +364,27 @@ def format_percent(number, format=None, locale=LC_NUMERIC): >>> format_percent(0.346, u'#,###.##%', locale='en_US') u'34.6%' + In this case is considered the precision by format and not the param scale. + :param number: the percent number to format :param format: :param locale: the `Locale` object or locale identifier + :param scale: the number to change the percent precision """ + if scale and isinstance(scale, int): + frac = (scale, scale) + else: + frac = None + locale = Locale.parse(locale) if not format: format = locale.percent_formats.get(format) + else: + # if the format was setted is disconsidered any scale value + # to use the format scale + frac = None pattern = parse_pattern(format) - return pattern.apply(number, locale) + return pattern.apply(number, locale, force_frac=frac) def format_scientific(number, format=None, locale=LC_NUMERIC): diff --git a/tests/test_numbers.py b/tests/test_numbers.py index 2593cc017..56a1a479e 100644 --- a/tests/test_numbers.py +++ b/tests/test_numbers.py @@ -272,13 +272,27 @@ def test_format_currency_format_type(): def test_format_percent(): assert numbers.format_percent(0.34, locale='en_US') == u'34%' - assert numbers.format_percent(0.34, u'##0%', locale='en_US') == u'34%' + assert numbers.format_percent(0.345, u'##0%', locale='en_US') == u'34%' assert numbers.format_percent(34, u'##0', locale='en_US') == u'34' assert numbers.format_percent(25.1234, locale='en_US') == u'2,512%' assert (numbers.format_percent(25.1234, locale='sv_SE') == u'2\xa0512\xa0%') assert (numbers.format_percent(25.1234, u'#,##0\u2030', locale='en_US') == u'25,123\u2030') + assert numbers.format_percent(0.346, locale='en_US', scale=1) == u'34.6%' + assert numbers.format_percent(0.346, locale='en_US', scale=2) == u'34.60%' + assert numbers.format_percent(0.3465, locale='en_US', scale=2) == u'34.65%' + # this assertion verify that the scale format is greater than + # the input scale + assert numbers.format_percent( + 0.34654, format='#,###.##%', locale='en_US', scale=3) == u'34.65%' + assert numbers.format_percent( + 0.346, format='#,###.##%', locale='en_US', scale=3) == u'34.6%' + # this assertion is to validate if the format_percent + # is not broken if the scale input has a wrong type + assert numbers.format_percent(0.3465, locale='en_US', scale='a') == u'35%' + # validate bas percent format + assert numbers.format_percent(0.3465, locale='cs_CZ', scale=2) == u'34,65\xa0%' def test_scientific_exponent_displayed_as_integer(): From 2e7f6ad9e69e4aa0d56d7ae88d44f6936776d998 Mon Sep 17 00:00:00 2001 From: Vinicius Pacheco Date: Tue, 27 Dec 2016 00:53:22 -0300 Subject: [PATCH 5/5] removed white spaces --- babel/numbers.py | 2 +- tests/test_numbers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/babel/numbers.py b/babel/numbers.py index e4261de48..fbe3b8013 100644 --- a/babel/numbers.py +++ b/babel/numbers.py @@ -346,7 +346,7 @@ def format_percent(number, format=None, locale=LC_NUMERIC, scale=None): u'2,512%' >>> format_percent(25.1234, locale='sv_SE') u'2\\xa0512\\xa0%' - + You can set the percent precision changing the scale >>> format_percent(0.345, locale='en_US', scale=2) u'34.50%' diff --git a/tests/test_numbers.py b/tests/test_numbers.py index 56a1a479e..3aee3371e 100644 --- a/tests/test_numbers.py +++ b/tests/test_numbers.py @@ -272,7 +272,7 @@ def test_format_currency_format_type(): def test_format_percent(): assert numbers.format_percent(0.34, locale='en_US') == u'34%' - assert numbers.format_percent(0.345, u'##0%', locale='en_US') == u'34%' + assert numbers.format_percent(0.34, u'##0%', locale='en_US') == u'34%' assert numbers.format_percent(34, u'##0', locale='en_US') == u'34' assert numbers.format_percent(25.1234, locale='en_US') == u'2,512%' assert (numbers.format_percent(25.1234, locale='sv_SE')