原题链接
描述
请实现一个函数用来判断字符串str是否表示数值(包括科学计数法的数字,小数和整数)。
示例
输入:"123.45e+6"
返回值:true
思路
从头依次遍历,针对各种情况设置符号标志,乍一看比较简单的但是细节很多,一不小心就会遗漏一些。有些会被认为不是数值的输入也会返回 true,主要有"1." ".1"
。
解答
package com.klaus.math.prob53;
public class Solution {
public boolean isNumeric(String str) {
int context = 0;// 是否有意义的内容
int token = 0;
int before = 0;//点前面的位数
int point = 0;
int after = 0;// 点后面的位数
int e = 0;
for (int i = 0; i < str.length(); ++i) {
// 空格
if (str.charAt(i) == ' ') {
--context;
}
// 正负号
else if (str.charAt(i) == '+' || str.charAt(i) == '-') {
// 幂符号
if (i == 0) {
++token;
}
// 指数符号
else if (str.charAt(i - 1) == 'e' || str.charAt(i - 1) == 'E') {
++token;
} else
return false;
if (token > 1) return false;
}
// e
else if (str.charAt(i) == 'e' || str.charAt(i) == 'E') {
if (before == 0)
return false;
++e;
if (e > 1)
return false;
token = 0;
point = 1;
}
// 小数点
else if (str.charAt(i) == '.') {
point++;
after = 0;
if (point > 1)
return false;
}
// 数字
else if (str.charAt(i) >= '0' && str.charAt(i) <= '9') {
if (point == 0) {
before++;
after++;
} else
after++;
} else {
return false;
}
++context;
}
// 如果没有点
if (e == 1 && after == 0)
return false;
if (token == 1 && after == 0)
return false;
if (context <= 0)
return false;
if (point == 1 && after == 0 && before == 0)
return false;
return true;
}
}