题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
思路
全面考虑数值中,整数,小数,指数部分的特点,比如哪些部分可以出现正负号,而哪些部分不能。
'.'前或后可以没有没有数字
'e/E’前面必须有数字,后面必须是整数
代码
def isNumeric(s):
spl = s.split('.')
if len(spl)>2: # 不能有超过(含)两个小数点的
return False
elif len(spl)>1: # decimal
integer = spl[0]
last = spl[1]
if integer[0] == '+' or integer[0] == '-':
integer = integer[1:]
if not checkint(integer):
return False
# 小数部分不能带符号
if (last[0] == '+' or last[0] == '-'):
return False
else:
integer = None
last = spl[0]
# 整数小数都为空
if (integer == None and len(last) == 0 ):
return False
spe = last.split('e')
spE = last.split('E')
exponent = None
if len(spe)>1:
aheade = spe[0]
exponent = spe[1]
elif len(spE) >1:
aheade = spE[0]
exponent = spE[1]
else:
aheade = spe[0]
# 小数部分是0-9
if integer != None and checkint(aheade):
return True
# 无小数且无指数,如果不是纯整数,那么就不是数值
if integer == None:
if aheade[0] == '+' or aheade[0] == '-':
aheade = aheade[1:]
if checkint(aheade):
return True
return False
# 指数前/后面要有数字
if len(aheade) == 0 or len(exponent) == 0:
return False
# 指数后面不能是小数
if len(exponent.split('.'))>1:
return False
if exponent[0] == '+' or exponent[0] == '-':
exponent = exponent[1:]
if checkint(exponent):
return True
def checkint(s):
l = [str(i) for i in range(10)] # 定义整数转换的字符串数组
for i in range(len(s)):
if s[i] in l:
continue
else:
return False
return True