|
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