How to check if a user input is a float

放肆的年华 提交于 2019-11-29 15:43:22

isinstance(next, (float, int)) will do the trick simply if next is already converted from a string. It isn't in this case. As such you would have to use re to do the conversion if you want to avoid using try..except.

I would recommend using the try..except block that you had before instead of a if..else block, but putting more of the code inside, as shown below.

def gold_room():
    while True:
        print "This room is full of gold. What percent of it do you take?"
        try:
            how_much = float(raw_input("> "))

            if how_much <= 50:
                print "Nice, you're not greedy, you win!"
                exit(0)

            else:
                dead("You greedy bastard!")

        except ValueError: 
            print "Man, learn to type a number."

This will try to cast it as a float and if it fails will raise a ValueError that will be caught. To learn more, see the Python Tutorial on it.

RE would be a good choice

>>> re.match("^\d+.\d+$","10")
>>> re.match("^\d+.\d+$","1.00001")
<_sre.SRE_Match object at 0x0000000002C56370>

If the raw input is a float number, it will return an object. Otherwise, it will return None. In case you need to recognize the int, you could:

>>> re.match("^[1-9]\d*$","10")
<_sre.SRE_Match object at 0x0000000002C56308>

You can use a regex to validate the format:

r'^[\d]{2}\.[\d]+$'

You can found the documentation here: https://docs.python.org/2/library/re.html

The problem I have with your approach is that you're going down a path of "Look Before You Leap" instead of the more Pythonic "Easier to Ask Forgiveness than Permission" path. I think your original solution is better than trying to validate the input in this way.

Here is how I would write it.

GREEDY_LIMIT = 50

def gold_room():
    print("This room is full of gold. What percent of it do you take?")

    try:
        how_much = float(raw_input("> "))
    except ValueError:
        print("Man, learn to type a number.")
        gold_room()
        return

    if how_much <= GREEDY_LIMIT:
        print "Nice, you're not greedy, you win!"
        exit(0)

    else:
        dead("You greedy bastard!")

use below python based regex checking for float strings

import re
a=re.match('((\d+[\.]\d*$)|(\.)\d+$)' ,  '2.3') 
a=re.match('((\d+[\.]\d*$)|(\.)\d+$)' ,  '2.')
a=re.match('((\d+[\.]\d*$)|(\.)\d+$)' ,  '.3')
a=re.match('((\d+[\.]\d*$)|(\.)\d+$)' ,  '2.3sd')
a=re.match('((\d+[\.]\d*$)|(\.)\d+$)' ,  '2.3')

output: !None, !None, !None, None , !None then use this output to do conversions.

If you don't want to use try/except, below is my answer :

def gold_room():
    print "This room is full of gold. How much do you take?"

    choice = input("> ")

    if choice.isdigit():
        how_much = int(choice)
    elif "." in choice:
        choice_dot = choice
        choice_dot_remove = choice_dot.replace(".","")
        if choice_dot_remove.isdigit():
            how_much = float(choice)

    else:
        dead("Man, learn to type a number.")

    if how_much < 50:
        print "Nice, you're not greedy, you win!"
        exit(0)

    else:
        dead("You greedy bastard!")
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!