On 03/29/2013 07:33 AM, Ghadir Ghasemi wrote:
Hi guys I am trying to create part of a vending machine. The section below is if the user wants to
insert 50p coins. It works but when I entered a non integer like 'dfsdf', the program just broke. Is there a way that the program can check if the input is an integer, and if it is, then the program does all the calculations, but if it isn't the program just keeps asking for an input? Thanks. Here is the section.
>
> fiftypencecoins = int(input("how many 50p coins do you want to insert or press 'e' to exit : "))
> if fiftypencecoins == 'e':
>         break
> else:
>      currentmoney += fiftypencecoins * 5/10
>      print("your newly updated credit is £" + str(currentmoney) + "0")
> _______________________________________________
>


I've recently made a couple of functions that do this in a more general
way. There are some usage examples at the end, including y/n input. The
difference between them is that the 2nd function adds more options.



import re

def simpleinp(pattern, prompt="> ", convert=None, errmsg="Invalid Input", blank=False):
    """Keep asking user for input until it matches `pattern`."""
    if pattern == "%d": pattern = "\d+"; convert = int
    if pattern == "%s": pattern = ".+"

    while True:
        i = input(prompt).strip()
        if blank and not i: return None

        if re.match('^'+pattern+'$', i):
            return convert(i) if convert and i else i
        else:
            print(errmsg)


def getinp(pattern, prompt="> ", convert=None, errmsg="Invalid Input", ignorecase=False, lower=False, blank=True):
    """Keep asking user for input until it matches `pattern`."""
    if pattern == "%d":
        pattern = "\d+"
        convert = int
    if pattern == "%f":
        pattern = "\d+.?\d*"
        convert = float
    if pattern == "%s":
        pattern = "\S+"

    while True:
        i = input(prompt).strip()
        if blank and not i:
            return None
        if lower:
            i = i.lower()
        flags = re.I if ignorecase else 0

        if re.match('^'+pattern+'$', i, flags=flags):
            return convert(i) if convert else i
        else:
            print(errmsg)


# print( getinp("%d", "integer: ") )
# print( getinp("%f", "float: ") )
# print( getinp("%s", "string: ") )
# print( getinp("(y|n)", "y/n: ", lower=True) )

# print( simpleinp("%d", "integer: ") )
# print( simpleinp("%s", "string: ") )
# print( simpleinp(".*", "string or blank: ") )
# print( simpleinp("[ynYN]", "y/n: ") )



HTH, -m

--
Lark's Tongue Guide to Python: http://lightbird.net/larks/

Blessed are the forgetful: for they get the better even of their blunders.
Friedrich Nietzsche

_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to