Ну можно сделать регулярку. Но вообще тебе правильно подсказывают: сделай валидацию ввода! Всё равно юзеров не перехитришь, с них станется прописью ввести.
import re
from decimal import Decimal # не используй float для денег!
sum_regexp = re.compile(r'^((?:\D*\d+)+?)(?:\D+(\d{2}))?\D*$')
def string_to_sum(s: str) -> Decimal:
match = sum_regexp.match(s)
if match is None:
raise ValueError(f'Not a correct sum: {s!r}')
integer_part = re.sub(r'\D', '', match.group(1))
fraction = match.group(2) or '00'
fixed_string = f'{integer_part}.{fraction}'
return Decimal(fixed_string)
tests = {
'0': Decimal('0.0'),
'1000': Decimal('1000.0'),
'10.00': Decimal('10.0'),
'10,00': Decimal('10.0'),
'1 000': Decimal('1000.0'),
'1,000,000.00': Decimal('1_000_000.00'),
'1000 рублей 90 копеек': Decimal('1000.90'),
}
for inp, res in tests.items():
print(inp, end=': ')
try:
actual_res = string_to_sum(inp)
except ValueError as err:
print('Exception: ', err)
else:
if res != actual_res:
print('Mismatch, got', actual_res)
else:
print('OK')