请实现一个函数用来判断字符串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; } }