Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查输入的十进制数_Python_Raw Input - Fatal编程技术网

Python 检查输入的十进制数

Python 检查输入的十进制数,python,raw-input,Python,Raw Input,我想检查输入是否是一个数字(带0、1或2个小数的浮点)并且大于0 def getnumber(): print ( "write a number: \n") isValid = False while not isValid: try: number = float(raw_input().replace(",",".")) if number >= 0: isVali

我想检查输入是否是一个数字(带0、1或2个小数的浮点)并且大于0

def getnumber():
    print ( "write a number: \n")
    isValid = False
    while not isValid:
        try:
            number = float(raw_input().replace(",","."))
            if number >= 0:
                isValid=True
            else:
                print ("Number not valid")
                isValid = False
                getnumber()
        except:
            print ("Number not valid")
    return number
我有以下问题:

1-我不知道如何检查是否只有两个小数

2-如果我首先引入负数,代码不会返回数字

有人知道怎么修吗


非常感谢

您的代码不能处理负数的原因是,当负数为负数时,函数会递归调用自身,
isValid
的值在调用后总是false,因此循环会重复

实际上不需要布尔变量

这就给你留下了检测小数点后两位的问题。为了能够在字符串级别执行此操作,您必须保留转换为浮点数的字符串。假设您将其存储为
s
,您可以使用一些测试,如
len(s)>3
和s[-3]='.`来验证它

这将为您提供如下解决方案:

def getnumber():
    while True:
        try:
            s = raw_input("Write a number:").replace(",",".")
            number = float(s)
            if number >= 0 and len(s) > 3 and s[-3] ==".":
                return number
            else:
                print("Negative or not two decimal places")
        except Exception:
            print("Invalid number")

print(getnumber())

您可以随时检查字符串,查看句点后是否有一个
和两个字符。我不确定您为什么要用小数点替换逗号。该死,为什么这么多人使用while循环和递归来获取输入?删除函数中对
getnumber()
的调用将解决#2。当然,如果您想要不同的负数和错误位数错误消息,您可以将测试拆分。不过,为什么要使用
try…除了
?这不会给无效号码检测带来任何影响,并且可能会隐藏其他应明确处理的异常。对不起,Ups。我没有很好地解释我自己。如果一个数字有0、1或2,我想返回该数字。我猜代码没有检查它。是我的错。Sorry@Jessica然后,您应该明确地编写类似
的内容,除了ValueError:
之外,以便只捕获与输入性质相关的错误。除了:
子句之外,你不应该使用裸露的
,它会导致无法理解的错误和无尽的头痛!我使用了
除了Exception
,因为我想捕捉甚至是意外的错误,尽管仍然允许像
键盘中断这样的事情通过。几乎可以肯定,除了ValueError之外,使用
会更好。我同意除了
之外的一个简单的
是非常糟糕的做法