题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
-
'.‘两种情况:a>前面有有无符号的整数,flag = True,接下来最后处理,例:1.a,先判断为True
b>前面为空,后面有无符号的整数(如果前面为整数,小数点后面可以为’e’或’E’,这位情况a>) -
‘e’或’E’ 前后必须有有无符号的整数,因为完整表达式为科学计数法aeb = a * (10 *** b), a为实数,b为整数,去掉a或b这个科学技术法式子都残缺。
-
‘.’ ,‘e’ 或’E’ 都只能出现一次
-- coding:utf-8 --
class Solution:
def init(self):
self.index = 0def isNumeric(self, s): if not s: return False flag = self.scanInteger(s) # 先判断有 有无符号的整数, 扫描整数,包括符号 if self.index < len(s) and s[self.index] == '.': self.index += 1 # s的下标跳过'.' # 小数点前面为空,小数点后面必须是无符号整数才是数值,后面为有符号整数错误 flag = self.scanUnsignedInteger(s) or flag # a>小数点后面为整数(包括小数点前面为有无符号的整数和空)b>小数点前面有有无符号的整数即为True(包括1.a也为True)小数点后面为e或E或+(1.+1表示1.0+1 = 2.0)或-(1.-1表示1.0-1 = 0.0)(小数点前面有有无符号的整数), if self.index < len(s) and (s[self.index == 'e' or s[self.index] == 'E']): self.index += 1 flag = self.scanInteger(s) and flag # 'e'或'E'的前后必须有有无符号的整数 # 解决了1.a的问题,因为1.a的self.index为len(s) - 1,结果为False return flag and self.index == len(s) # 不是self.index == len(s) - 1 ,因为把字符串检查完了之后self.index = len(s) def scanInteger(self, s): if self.index < len(s) and (s[self.index] == '+' or s[self.index] == '-'): self.index += 1 return self.scanUnsignedInteger(s) def scanUnsignedInteger(self, s): start = self.index # 不能写s[self.index] < '0'因为可能有符号,小数点,'e'或'E' while self.index < len(s) and s[self.index] >= '0' and s[self.index] <= '9': self.index += 1 return start < self.index # 有符号整数,则为True,否则为False
方法二:
# -*- coding:utf-8 -*-
class Solution:
def isNumeric(self, s):
try:
ss = float(s)
return True
except:
return False