描述
Validate if a given string is numeric.
Some examples:"0"
=> true
" 0.1 "
=> true
"abc"
=> false
"1 a"
=> false
"2e10"
=> true
分析
该题的说明比较模糊,所以需要慢慢进行尝试来弄清楚哪些是合法的数字。整理了以下规则:
- 符号只能出现在最前面或者字符
e
后面一位 - ‘ . ‘只能
e
的前面,且只能有一个小数点 -
e
最多只能出现一次,且前面必须有数字,后面也必须有数字
所以按照数字、小数点、e
和符号这四类列出规则就可以了,记住e
后面必须有数字,所以需要增加一个变量numberAftereSeen
。
代码
class Solution:
def isNumber(self, s):
"""
:type s: str
:rtype: bool
"""
# 去除前后的空格
temp_s = s.strip()
numberSeen = False
pointSeen = False
eSeen = False
numberAftereSeen = True
for i in range(len(temp_s)):
if temp_s[i].isdigit():
numberSeen = True
numberAftereSeen = True
elif temp_s[i] == ".":
# 小数点前面不能出现e和小数点
if eSeen or pointSeen:
return False
pointSeen = True
elif temp_s[i] == "e":
# e前面不能出现e,并且需要有数字
if eSeen or not numberSeen:
return False
eSeen = True
# 保证e后面也有数字
numberAftereSeen = False
elif temp_s[i] in ["+", "-"]:
# 符号只能再0位和e后面一位
if i != 0 and temp_s[i-1] != "e":
return False
else:
return False
return numberSeen and numberAftereSeen