Программа Python, не принимающая десятичный необработанный ввод - PullRequest
0 голосов
/ 28 марта 2012

Я работаю над небольшим платежным проектом на python, где вы вводите имя сотрудника, заработную плату и отработанное время.Когда я ввожу десятичные числа для ввода заработной платы, я получаю «недопустимую запись» из-за обработки моих исключений.Почему десятичные числа возвращаются как недействительные?Кроме того, как я могу зациклить эту программу, чтобы она оставила те же 3 вопроса, пока пользователь не введет «Готово»?Любая помощь будет оценена!Спасибо!

import cPickle

def getName():
    strName="dummy"
    lstNames=[]
    strName=raw_input("Enter employee's Name: ")
    lstNames.append(strName.title() + " \n")


def getWage():
    lstWage=[]
    strNum="0"
    blnDone=False
    while blnDone==False: #loop to stay in program until valid data is entered
        try:
            intWage=int(raw_input("Enter employee's wage: "))
            if intWage >= 6.0 and intWage <=20.0:
                lstWage.append(float(strNum)) #convert to float
                blnDone=True
            else:
                print "Wage must be between $6.00 and $20.00"
        except(ValueError): #if you have Value Error exception.  Explicit on error type
            print "Invalid entry"


def getHours():
    lstHours=[]
    blnDone=False
    while blnDone==False: #loop to stay in program until valid data is entered
        try:
            intHrs=int(raw_input("Enter number of hours worked: "))
            if intHrs >= 1.0 and intHrs <=60.0:
                blnDone=True
            else:
                print "Hours worked must be 1 through 60."
        except(ValueError): #if you have Value Error exception.  Explicit on error type
            print "Invalid entry"

def getDone():
    strDone=""
    blnDone=False
    while blnDone==False:
        try:
            srtDone=raw_input("Type \"DONE\" if you are finished entering names, otherwise press enter: ")
            if strDone.lower()=="done":
                blnDone=True
            else:
                print "Type another empolyee name"
        except(ValueError): #if you have Value Error exception.  Explicit on error type
            print "Invalid entry"


##### Mainline ########

strUserName=getName()
strWage=getWage()
strHours=getHours()
srtDone1=getDone()

Ответы [ 5 ]

3 голосов
/ 28 марта 2012

Вот суть этого:

>>> int("4.3")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '4.3'

Вы не можете преобразовать строку в целое число, если оно не является целым числом. Поэтому, когда вы делаете intWage=int(raw_input("Enter employee's wage: ")), он выбрасывает ValueError. Возможно, вам следует преобразовать его непосредственно в float.

2 голосов
/ 28 марта 2012

Поскольку вы преобразуете ввод в int:

intWage=int(raw_input("Enter employee's wage: "))
1 голос
/ 28 марта 2012

Вы предполагаете, что заработная плата является целым числом, которое по определению не имеет десятичного разряда.Попробуйте это:

intWage=float(raw_input("Enter employee's wage: "))
0 голосов
/ 18 августа 2015

Попробуйте использовать

intWage=int(float(raw_input("Enter employee's wage: ")))

Это будет принимать десятичное число в качестве ввода.

0 голосов
/ 28 марта 2012

Ошибка с плавающей точкой

Как уже говорили другие, вы предполагаете, что вход будет плавающим.Либо используйте float() или eval() вместо int():

intWage = float(raw_input("Enter employee's wage: "))

, либо используйте input() вместо int(raw_input()):

intWage = input("Enter employee's wage:")

Оба будут выполнять одно и то же,Да, и измените intWage на floatWage по крайней мере, или даже лучше, не используйте венгерскую нотацию.

Код

Что касается вашего кода, я сделал пару вещей:

  • Используется break и / или return для завершения циклов вместо отслеживания логических значений (в этом и заключается цель операторов break и continue)
  • Изменено intWage на floatWage
  • Переписано сравнение чисел более кратким способом (x <= y and x >= z можно записать как z >= x >= y)
  • Добавлены операторы возврата.Я не понимаю, почему вы не поставили их сами, если только вы не хотите присвоить None на strUserName, strWage и strHours)
  • Добавил цикл, который вы запрашивали при запросесведения о сотруднике.
  • Изменено getDone() для работы с циклом.

import cPickle</p> <pre><code>def getName(): strName = "dummy" lstNames = [] strName = raw_input("Enter employee's Name: ") lstNames.append(strName.title() + " \n") return strName def getWage(): lstWage = [] strNum = "0" while True: #Loop to stay in program until valid data is entered try: floatWage = float(raw_input("Enter employee's wage: ")) if 6.0 <= floatWage <= 20.0: lstWage.append(floatWage) return floatWage else: print "Wage must be between $6.00 and $20.00" except ValueError: #Catches ValueErrors from conversion to float print "Invalid entry" def getHours(): lstHours = [] while True: #loop to stay in program until valid data is entered try: intHrs=int(raw_input("Enter number of hours worked: ")) if 1.0 <= intHrs <= 60.0: return intHrs else: print "Hours worked must be 1 through 60." except ValueError: #Catches ValueErrors from conversion to int print "Invalid entry" def getDone(): strDone = "" while True: srtDone = raw_input('Type "DONE" if you are finished entering names, otherwise press enter: ') if strDone.strip().lower() == "done": return True else: print "Type another empolyee name" while not getDone(): strUserName = getName() strWage = getWage() strHours = getHours()

Пример break и continue

Операторы break внутрицикл (for и while) завершает цикл и пропускает все предложения else (если они есть).

Операторы continue пропускают остальную часть кода в цикле, а продолжает цикл, как будто ничего не произошло.

Предложение else в конструкции for...else выполняет кодовый блок, когда цикл исчерпал все элементы и вышел нормально, т. Е. Когда онне завершается break или чем-либо.

for no in range(2, 10):
    for factor in range(2, no):
        if no % factor == 0:
            if factor == 2:
                print "%d is even" % no
                continue  
                # we want to skip the rest of the code in this for loop for now
                # as we've already done the printing
            print "%d = %d * %d" % (no, factor, n/x)
            break 
           # We've asserted that the no. isn't prime, 
           # we don't need to test the other factors
    else:
        # if 'break' wasn't called
        # i.e., if the loop fell through w/o finding any factor
        print no, 'is a prime number'
...