From 6bf8745f6a913af71357583e8e97116fcfd444ca Mon Sep 17 00:00:00 2001 From: Changaco Date: Sun, 17 Jun 2018 09:17:02 +0200 Subject: [PATCH] include more information in error message --- babel/numbers.py | 19 +++++++++++++++---- tests/test_numbers.py | 3 +++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/babel/numbers.py b/babel/numbers.py index 509150cb..b0cfe65e 100644 --- a/babel/numbers.py +++ b/babel/numbers.py @@ -682,7 +682,7 @@ def parse_decimal(string, locale=LC_NUMERIC, strict=False): >>> parse_decimal('30.00', locale='de', strict=True) Traceback (most recent call last): ... - NumberFormatError: '30.00' is not a properly formatted decimal number + NumberFormatError: '30.00' is not a properly formatted decimal number. Did you mean '3.000'? Or maybe '30,00'? :param string: the string to parse :param locale: the `Locale` object or locale identifier @@ -702,9 +702,20 @@ def parse_decimal(string, locale=LC_NUMERIC, strict=False): if strict and group_symbol in string: proper = format_decimal(parsed, locale=locale, decimal_quantization=False) if string != proper and string.rstrip('0') != (proper + decimal_symbol): - raise NumberFormatError( - "%r is not a properly formatted decimal number" % string - ) + try: + parsed_alt = decimal.Decimal(string.replace(decimal_symbol, '') + .replace(group_symbol, '.')) + except decimal.InvalidOperation: + raise NumberFormatError( + "%r is not a properly formatted decimal number. Did you mean %r?" % + (string, proper) + ) + else: + proper_alt = format_decimal(parsed_alt, locale=locale, decimal_quantization=False) + raise NumberFormatError( + "%r is not a properly formatted decimal number. Did you mean %r? Or maybe %r?" % + (string, proper, proper_alt) + ) return parsed diff --git a/tests/test_numbers.py b/tests/test_numbers.py index 50c53dec..b9dcb727 100644 --- a/tests/test_numbers.py +++ b/tests/test_numbers.py @@ -169,6 +169,9 @@ class NumberParsingTestCase(unittest.TestCase): # Numbers with a misplaced grouping symbol should be rejected with self.assertRaises(numbers.NumberFormatError): numbers.parse_decimal('11.11', locale='de', strict=True) + # Numbers with two misplaced grouping symbols should be rejected + with self.assertRaises(numbers.NumberFormatError): + numbers.parse_decimal('80.00.00', locale='de', strict=True) # Partially grouped numbers should be rejected with self.assertRaises(numbers.NumberFormatError): numbers.parse_decimal('2000,000', locale='en_US', strict=True) -- 2.47.3