2013-02-19 117 views
3

我想要做的是验证一个字符串是否是数字 - 一个浮点数 - 但我还没有找到一个字符串属性来做到这一点。也许没有一个。我有一个问题与此代码:如何验证字符串是否是有效的浮点数?

N = raw_input("Ingresa Nanometros:"); 
if ((N != "") and (N.isdigit() or N.isdecimal())): 
    N = float(N); 
    print "%f" % N; 

正如你所看到的,我需要的是只取数字,十进制或浮动。 N.isdecimal()不能解决我心中的问题。

+4

Python的口头禅是*“请求原谅,而不是许可。” * - 尝试它,捕捉到的异常,如果它出错。 – 2013-02-19 02:11:38

+1

如果你想知道你的代码为什么不起作用:如果'N'中的每个字符都是数字,则'N.isdigit()'为真。对于'3.14'来说不是这样。你问:“每个字符都是数字,还是每个字符都是小数?”当你想要问“每个字符是一个数字还是一个小数”时,它将被拼写为'all(ch.isdigit()或ch.isdecimal()for ch in N)'。当然,这对于例如'-3.14'或其他完全有效的'float'来说仍然不起作用。这是“容易要求宽恕而不是权限”的许多原因之一,“这是做到这一点的一种方式” - 但它仍然值得理解“isdigit”。 – abarnert 2013-02-19 02:29:48

回答

10
try: 
    N = float(N) 
except ValueError: 
    pass 
except TypeError: 
    pass 

这将尝试N转换为float。但是,如果它不可能(因为它不是一个数字),它将会pass(什么都不做)。我建议你阅读try and except blocks

你也可以这样做:

try: 
    N = float(N) 
except (ValueError, TypeError): 
    pass 
+1

如果'N'是'None',那么你会得到'TypeError',你的代码将会爆炸。使用'float(N或'')' – 2013-02-19 02:15:19

+0

@YevgenYampolskiy啊,那是真的。我加入'除了TypeError'以避免这种情况。 – 2013-02-19 02:18:15

+3

'除了(ValueError,TypeError)as e:pass'至少 – 2013-02-19 02:30:14

相关问题