#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 до 9d*
: после первой цифры допускается любое количество цифр(.d{1,2})?
: необязательная дробь из 1-2 цифр с разделителем точек. Используйте[.,]
вместо.
, если требуется поддержка нескольких разделителей