Проверка плавающих значений из пользовательского ввода - PullRequest
0 голосов
/ 13 мая 2018

Эта функция будет принимать строку в качестве ввода.Строка имеет следующие свойства:

  • Включает символы 0-9
  • Может включать точку для обозначения центов.(Если не включено, предположите 0 центов.)
  • Может включать знак $.
  • Может включать запятые в качестве разделителей цифр.

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

Если ввод недействителен, вернуть -1 в качестве результата функции.

Если я введу следующее:

100.00
200
98.78
$1,009.78
Goat
exit

Вот как выглядит вывод:

Determine Price with Tax.
Enter 'exit' at any time to quit.
Enter Amount ($X,XXX.XX):
Amount: 100.0
Tax: 6.0
Price w/ Tax: 106.0
Enter Amount ($X,XXX.XX):
Amount: 200
Tax: 12.0
Price w/ Tax: 212.0
Enter Amount ($X,XXX.XX):
Amount: 98.78
Tax: 5.93
Price w/ Tax: 104.71
Enter Amount ($X,XXX.XX):
Amount: 1009.78
Tax: 60.59
Price w/ Tax: 1070.37
Enter Amount ($X,XXX.XX):
Amount: -1
Tax: -0.06
Price w/ Tax: -1.06
Enter Amount ($X,XXX.XX):

Мой код:

def price_to_int(text):
    res = 0
    valid = "$,.1234567890"
    for l in text:
        if l in valid:
            res = float(text)
        else:
            return -1
    return res

#---------You may not make any changes below this line-----------   
print("Determine Price with Tax.")
print("Enter 'exit' at any time to quit.")
word = input("Enter Amount ($X,XXX.XX):\n")
while word.lower() != "exit":
    d = price_to_int(word)
    tax = 0.06
    print("Amount:",round(d,2))
    print("Tax:",round(d*tax,2))
    print("Price w/ Tax:",round(d+d*tax,2))
    word = input("Enter Amount ($X,XXX.XX):\n")

Единственное неправильное определение функции.Мой код работает до тех пор, пока я не введу «1009,78 $».Меня специально просят только переписать определение функции и больше ничего не менять.

1 Ответ

0 голосов
/ 13 мая 2018

Ваше текущее решение не кажется мне правильным. Вы перебираете свою строку посимвольно, вызывая каждый аргумент. Вы хотите конвертировать всю строку сразу (в противном случае, как вы получите свой float?).

Хотите решение, которое обрабатывает исключения с использованием try ... except?

def price_to_int(text):
    clean_text = text.lstrip('$').replace(',', '')
    try:
        return int(clean_text)
    except:
        try:
            return float(clean_text)
        except ValueError:
            return -1

Это решение очищает вашу строку и пытается бросить, чтобы плавать. Если преобразование невозможно, возникает ошибка, которая обрабатывается, и возвращается -1.

Подробнее

  • str.lstrip удаляет ведущий $ символ
  • str.replace удаляет запятые (когда вторым аргументом является пустая строка)
  • try ... except ValueError: ... попытается запустить код внутри блока try в ожидании перехвата исключения ValueError. Если возникает исключение, выполняется код внутри блока except (в противном случае - нет).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...