请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
表示数值的字符串遵循模式A[.[B]][e|EC]
或者.B[e|EC]
,其中A为数值的整数部分,B紧跟着小数点为数值的小数部分,C紧跟着’e’或者’E’为数值的指数部分。分析这三个部分可以看出,整数部分由于可以是负数,故除了第一个字符以外其实等价于其它两种情况,即scan_unsigned_integer()函数
。为了避免.e+3
的情况出现,前两个部分的标志位至少有一个为真才行。
class Solution:
def is_numeric(self, s):
if not s:
return False
integer_flag, dot_flag, exponent_flag = False, False, False
integer_flag, idx = self.scan_integer(s, 0)
if idx < len(s) and s[idx] == '.':
dot_flag, idx = self.scan_unsigned_integer(s, idx+1)
if not (integer_flag or dot_flag): # 有一个为真即可,否则为错误情况
return False
if idx < len(s)-1 and (s[idx] == 'e' or s[idx] == 'E'):
exponent_flag, idx = self.scan_integer(s, idx+1)
return idx == len(s)
def scan_integer(self, s, start):
if s[start] == '+' or s[start] == '-':
start += 1
return self.scan_unsigned_integer(s, start)
def scan_unsigned_integer(self, s, start):
current = start
while current < len(s) and s[current] >= '0' and s[current] <= '9':
current += 1
return current > start, current # 没有移动则没有该部分的存在
st = Solution()
numeric = '123.e+4'
print(st.is_numeric(numeric))
直接使用浮点数函数进行转化,捕获值异常错误输出。
class Solution:
def is_numeric(self, s):
try:
value = float(s)
return True
except ValueError:
return False
(最近更新:2019年09月21日)