Python — проверка валюты

#python

#python

Вопрос:

Каков наилучший способ проверки входных данных в качестве валюты (без каких-либо символов валюты) Мои допустимые входные данные могут быть только в форме 40 или 40.12

Комментарии:

1. как выглядят необработанные входные данные?

Ответ №1:

Как насчет простого использования format() и попытки / за исключением неправильных значений?

 >>> "{:.2f}".format(float("40.12"))
'40.12'
>>> "{:.2f}".format(float("40"))
'40.00'
>>> "{:.2f}".format(float("40.123"))
'40.12'
>>> try:
...     "{:.2f}".format(float("40.123€"))
... except ValueError:
...     "fail"
... 
'fail'
  

Обратите внимание, что он просто сокращает любое число за вторым числом после десятичной запятой.
Вы должны быть более конкретными, показав нам больше примеров с желаемым поведением.

Ответ №2:

Вы могли бы использовать регулярное выражение:

 re.match(r'd (?:[.]d{2})?$', '40.12')
  

Это возвращает объект соответствия, если ввод правильный, или None если это не так.

Приведенное выше регулярное выражение соответствует одной или нескольким цифрам, за которыми необязательно следует точка, и еще ровно две цифры. Это может быть изменено по мере необходимости, если я не точно определил ваши требования (формулировка проблемы несколько открыта для интерпретации).

Комментарии:

1. обратите внимание, что это не будет работать для ввода типа «40.123» — это действительно зависит от ваших точных требований, пожалуйста, уточните, как обрабатывать такой ввод, приведя больше примеров с желаемым поведением.

2. Две десятичные цифры имеют смысл для кассового аппарата продуктового магазина в США, но не имеют смысла для заправочной станции в США, биткойнов или биржевой торговли, все из которых могут иметь дополнительные десятичные знаки.

3. спасибо, NPE отлично работает. Я немного изменил его. заменил [.] на . и я заставил его работать на 1 или два знака после запятой. ie: 24.5 или 24.50 re.match(r'd (?:.d{1,2})?$', price)

Ответ №3:

Я около часа искал в Google правильный способ, как это сделать. Я не нашел ни одного действительно хорошего и безопасного способа и написал регулярное выражение ниже, чтобы сопоставить положительное ненулевое число с необязательными 1-2 цифрами после разделителя точек:

 re.match(r'^[1-9]d*(.d{1,2})?$', val)
  
  • ^ и $ : без сопоставления всей строки будут способы обмануть регулярное выражение.
  • [1-9] : первый символ всегда должен быть от 1 до 9
  • d* : после первой цифры допускается любое количество цифр
  • (.d{1,2})? : необязательная дробь из 1-2 цифр с разделителем точек. Используйте [.,] вместо . , если требуется поддержка нескольких разделителей