|
13 | 13 | # Module API |
14 | 14 |
|
15 | 15 | def cast_number(format, value, **options): |
16 | | - group_char = options.get('groupChar', _DEFAULT_GROUP_CHAR) |
17 | | - decimal_char = options.get('decimalChar', _DEFAULT_DECIMAL_CHAR) |
18 | | - if not isinstance(value, Decimal): |
19 | | - if isinstance(value, six.string_types): |
20 | | - value = re.sub(r'\s', '', value) |
21 | | - value = value.replace(decimal_char, '__decimal_char__') |
| 16 | + if isinstance(value, six.string_types): |
| 17 | + group_char = options.get('groupChar', _DEFAULT_GROUP_CHAR) |
| 18 | + decimal_char = options.get('decimalChar', _DEFAULT_DECIMAL_CHAR) |
| 19 | + value = _RE_WHITESPACE.sub('', value) |
| 20 | + if decimal_char != '.': |
| 21 | + if group_char: |
| 22 | + value = value.replace(decimal_char, '__decimal_char__') |
| 23 | + value = value.replace(group_char, '') |
| 24 | + value = value.replace('__decimal_char__', '.') |
| 25 | + else: |
| 26 | + value = value.replace(decimal_char, '__decimal_char__') |
| 27 | + value = value.replace('__decimal_char__', '.') |
| 28 | + elif group_char: |
22 | 29 | value = value.replace(group_char, '') |
23 | | - value = value.replace('__decimal_char__', '.') |
24 | | - if not options.get('bareNumber', _DEFAULT_BARE_NUMBER): |
25 | | - value = re.sub(r'((^\D*)|(\D*$))', '', value) |
26 | | - elif not isinstance(value, six.integer_types + (float,)): |
27 | | - return ERROR |
28 | | - elif value is True or value is False: |
29 | | - return ERROR |
30 | | - try: |
31 | | - if isinstance(value, float): |
32 | | - value = str(value) |
33 | | - value = Decimal(value) |
34 | | - except Exception: |
35 | | - return ERROR |
| 30 | + |
| 31 | + if not options.get('bareNumber', _DEFAULT_BARE_NUMBER): |
| 32 | + value = _RE_BARE_NUMBER.sub('', value) |
| 33 | + elif isinstance(value, Decimal): |
| 34 | + return value |
| 35 | + elif not isinstance(value, six.integer_types + (float,)): |
| 36 | + return ERROR |
| 37 | + elif value is True or value is False: |
| 38 | + return ERROR |
| 39 | + else: |
| 40 | + value = str(value) |
| 41 | + try: |
| 42 | + value = Decimal(value) |
| 43 | + except Exception: |
| 44 | + return ERROR |
36 | 45 | return value |
37 | 46 |
|
38 | 47 |
|
39 | 48 | # Internal |
40 | 49 |
|
| 50 | +_RE_WHITESPACE = re.compile(r'\s') |
| 51 | +_RE_BARE_NUMBER = re.compile(r'((^\D*)|(\D*$))') |
41 | 52 | _DEFAULT_GROUP_CHAR = '' |
42 | 53 | _DEFAULT_DECIMAL_CHAR = '.' |
43 | 54 | _DEFAULT_BARE_NUMBER = True |
0 commit comments