题目:
有效数字(按顺序)可以分成以下几个部分:
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
小数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:
(可选)一个符号字符('+' 或 '-')
至少一位数字
解题思路:
根据题目的规定,我们可以把有效数字的判定规则进行一个整理:
首先根据有没有e或E进行划分:
1. 如果有e或者E,只需要分别判断e或者E的左边是否为整数或者浮点数,右边是否为整数即可;
2. 如果没有e或者E,只需要判断字符串是否为整数或者浮点数即可。
判断字符串是否为整数或者浮点数有以下几个规则:
1. '.'只能出现一次;
2. ‘+’或‘-’只能在开头出现;
3. 至少有一个整数出现;
如果必须是整数的话,判断是否有'.’出现即可。
代码示例:
public class IsNumber {
public boolean isNumber(String s) {
int n = s.length();
char[] chars = s.toCharArray();
for (int index = 1; index < n; index++) {
if (chars[index] == 'e' || chars[index] == 'E') {
boolean left = check(chars, 0, index - 1, false);
boolean right = check(chars, index + 1, n - 1, true);
if (left && right) return true;
}
}
return check(chars, 0, n - 1, false);
}
public boolean check(char[] chars, int start, int end, boolean mustInteger) {
if (start > end) return false;
if (chars[start] == '+' || chars[start] == '-') start++;
boolean hasPoint = false, hasNumber = false;
for (int i = start; i <= end; i++) {
if (chars[i] == '.') {
if (mustInteger || hasPoint) return false;
hasPoint = true;
} else if (chars[i] >= '0' && chars[i] <= '9')
hasNumber = true;
else return false;
}
return hasNumber;
}
}