剑指offer 表示数值的字符串

表示数值的字符串

题目

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。

方法

方法1

表示数字的字符串遵循模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

**需要注意以下几点**:
- 小数可以没有整数部分,如.123=0.123。
- 如果一个数没有整数部分,其小数部分不能为空
- A和C都是可以是以'+'或'-'开头的0-9的数位串,B也是0-9的数位串,但前面不能有正负号

判断一个字符串是否符合上述模式时,首先尽可能多地扫描0-9的数位(有可能在起始处有'+'或'-',也就是前面模式中表示数值整数部分的A
如果遇到小数点'.',则开始扫描表示数值小数部分的B
如果遇到'e'or'E',则开始扫描表示数值的指数部分C

- 小数可以没有整数部分,如.123=0.123
- 小数点后面可以没有数字,如23.=23.0
- 小数点前后可以都有数字,如23.33

- 如果出现'e'or'E',则接下来就是数字的指数部分
- 当'e'or'E'前面没有数字时,整个字符换不能表示数字,如.e1、e1
- 当'e'or'E'后面没有整数(必须是整数,不能是小数)时,整个字符串不能表示数字,如12e、12e+5.4

```python
# -*- coding:utf-8 -*-
class Solution:
# s字符串
def isNumeric(self, s):
# write code here
if not s or len(s)<=0:
return False

string=s.lower()

# 如果有指数部分C
if 'e' in string:
indexE=string.index('e')
front=string[:indexE] # 别忘了冒号
behind=string[indexE+1:] # 别忘了冒号
# 指数部分没有整数时,则为无效
if '.' in behind or len(behind)==0:
return False
# 扫描整数部分A(含有小数部分B)和指数部分C,A可以是以'+'或'-'开头的0-9数位串
isFront=self.scanDigit(front)
isBehind=self.scanDigit(behind)
return isFront and isBehind
else:
isNum=self.scanDigit(string)
return isNum
def scanDigit(self, string):
dotNum=0
# allowVal = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '.', 'e']
allowVal=list('+-.e')+list(map(str,range(10)))
for i in range(len(string)):
if string[i] not in allowVal:
return False
if string[i]=='.':
dotNum+=1
if string[i] in '+-' and i!=0:
return False
if dotNum>1:
return False
return True

方法2

1
2
3
4
5
6
7
8
9
10
# -*- coding:utf-8 -*-
class Solution:
# s字符串
def isNumeric(self, s):
# write code here
try:
p=float(s)
return True
except:
return False