1. 题意
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
2. 思路
把所有表示数值的情况遍历出来
- 第一: 字符串只包含数字,小数点,正负号,字母’e’或’E’
- 第二:个数限制
- 出现e时: 只出现一次e, e之前和之后的部分都是数值,并且e之后必须为整数(可能带符号)
- 不出现e时,最多出现一个小数点,一个正负号,小数点之后必须有数字,正负号之后也得有
特别注意:+.123也是表示数值
3. python 实现
3.1 方法一:按照上述思路进行遍历
def isNumeric(self, s):
# write code here
def isDigit1(s): # 不出现e时,判断是否符合要求
if s[0] == '+' or s[0]=='-':
s = s[1:]
dot_index = s.find('.')
if dot_index != -1: # 出现小数点时
if s[0:dot_index] and s[0:dot_index].isdigit() and s[dot_index+1:].isdigit():
return True
if not s[0:dot_index] and s[dot_index+1:].isdigit():
return True
return False
else: # 不出现小数点时
return s.isdigit()
def isInt(s): # 出现e时,e之后的数为整数
if not s: return False
if s[0] == '+' or s[0]=='-':
s = s[1:]
dot_index = s.find('.')
if dot_index == -1 and s.isdigit(): # 不出现小数点时
return True
return False
if not s: return False
for ch in s:
if ord('0')<=ord(ch)<=ord('9') or ch == '.' or ch=='+' or ch=='-' or ch=='e' or ch=='E':
continue
else:
return False
cc = []
e_index = -1
if 'e' in s:
cc = s.split('e')
e_index = s.find('e')
elif 'E' in s:
cc = s.split('E')
e_index = s.find('E')
if e_index == -1: # 不出现e时
return isDigit1(s)
else:
if len(cc) == 2: # 出现一个e时
return isDigit1(cc[0]) and isInt(cc[1])
return False
3.2 方法二:正则表达式匹配
import re
class Solution:
def isNumeric(self, s):
return re.match(r"^[\+\-]?[0-9]*(\.[0-9]*)?([eE][\+\-]?[0-9]+)?$",s)