【剑指Offer】表示数值的字符串

题目

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

实现

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
public boolean isNumeric(char[] str) {
if (str == null || str.length < 1)
return false;

int idx = 0;
boolean isNum = true;

if (str[idx] == '+' || str[idx] == '-')
idx++;

idx = scanNumber(str, idx);

if (idx < str.length && str[idx] == '.') {
idx++;

idx = scanNumber(str, idx);

if (idx < str.length && (str[idx] == 'e' || str[idx] == 'E'))
isNum = isExponential(str, idx + 1);
else if (idx < str.length && str[idx] != 'e' && str[idx] != 'E')
return false;
}
else if (idx < str.length && (str[idx] == 'e' || str[idx] == 'E'))
isNum = isExponential(str, idx + 1);
else if (idx < str.length && str[idx] != '.' && str[idx] != 'e' && str[idx] != 'E')
isNum = false;

return isNum;
}

private int scanNumber(char[] str, int idx) {
for(; idx < str.length; idx++) {
if (str[idx] < '0' || str[idx] > '9')
return idx;
}

return idx;
}

private boolean isExponential(char[] str, int idx) {
if (idx == str.length)
return false;

if (str[idx] == '+' || str[idx] == '-')
idx++;

if (idx == str.length)
return false;

idx = scanNumber(str, idx);

if (idx < str.length)
return false;

return true;
}