@Kirill-Gorelov
С ума с IT

Как получить и форматировать цену с копейками на python?

У нас в БД хранятся цены с копейками и без. И пользователи заполняют цены по разному. Кто-то с точкой кто-то без, кто-то через запятую.
То есть один клиент напишет цену так 123,36, а кто-то 123.36
Убрать точку или запятую мы не можем, тогда изменится сама цена.
Так же бывают случаи когда выделяют тысячи
123,4567.89 или 123.4567,89
Пользователи пишут цены как удобно, не считать копейки мы не можем, теоретический можем сделать большое условие которое будет проверять те или иные варианты написания цен. Но хотелось бы узнать, может кто знает способ получше или кто-то даже сталкивался с такой задачей...
  • Вопрос задан
  • 196 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ну можно сделать регулярку. Но вообще тебе правильно подсказывают: сделай валидацию ввода! Всё равно юзеров не перехитришь, с них станется прописью ввести.
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')
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы