请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
//强大的正则表达式,已经把我下面的那种解法虐了
public class Solution {
public static boolean isNumeric(char[] str) {
String string = String.valueOf(str);
return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
}
}
public class Solution {
/**分两种情况, * 1.第一种是第一个字符是数字,继续判断(****) 2.第二种第一个不是数字,那么分为以下两种 (1).第一个是'+'或者'-'; 继续判断(****),那从第二个字符开始的后面的字符串与1判断一样 (2).第一个不是的话,就不是数值 */
public static boolean isNumeric(char[] str) {
boolean flag = true;
boolean flagEafter = false;//防止123.45e+6中e后面的+因为不是属于e或者E的非法字符***掉***
int numdecimal = 0;
if (isDigit(str[0])) {//1.第一个字符是数字
for (int i = 1; i < str.length; i++) {
if (numdecimal > 1) {//如果'.'数目大于1
flag = false;
break;
}
if (!isDigit(str[i])) {//如果不是数字
if (str[i]=='.') numdecimal++;
else if (str[i]=='e'||str[i]=='E') {//如果当前字符是e,E,那么后面的数字必须全是整数,否则就是false
if (i==str.length-1) {//如果是e或者E但是,e或者E作为最后一个字符
flag = false;
break;
}
else if (str[i+1]=='-'||str[i+1]=='+') {//如果出现了-或者+号,但是前面的字符不是e,或者E
if ((i+1) == str.length-1) {//比如"4e-"这种情况
flag = false;
break;
}
else {
int j = i+2;
for (j = i+2; j < str.length; j++) {
if (!isDigit(str[j])) {
flag = false;
break;
}
}
if (j==str.length) flagEafter = true;
}
} else {//排除4e3.12这种的
int j = i+1;
for (j = i+1; j < str.length; j++) {
if (!isDigit(str[j])) {
flag = false;
break;
}
}
if (j==str.length) flagEafter = true;
}
} else {//如果在e,E之前有除了-,+的其他字符
flag = false;
break;
}
}
}
if (flagEafter) flag = true;
} else {//2.如果第一个不是数字
if (str[0]=='-'||str[0]=='+') {
for (int i = 1; i < str.length; i++) {
if (numdecimal > 1) {//如果'.'数目大于1
flag = false;
break;
}
if (!isDigit(str[i])) {
if (str[i]=='.') numdecimal++;
else if (str[i]=='e'||str[i]=='E') {
if (i==1||i==str.length-1) {//如果是e或者E但是,e或者E作为最后一个字符
flag = false;
break;
}
else if (str[i+1]=='-'||str[i+1]=='+') {//如果出现了-或者+号,但是前面的字符不是e,或者E
if ((i+1) == str.length-1) {//比如"4e-"这种情况
flag = false;
break;
}
else {//
int j = i+2;
for (j = i+2; j < str.length; j++) {
if (!isDigit(str[j])) {
flag = false;
break;
}
}
if (j == str.length) flagEafter = true;
}
} else {
int j = i+1;
for (j = i+1; j < str.length; j++) {
if (!isDigit(str[j])) {
flag = false;
break;
}
}
if (j == str.length) flagEafter = true;
}
} else {//如果在e,E之前有除了-,+的其他字符
flag = false;
break;
}
}
}
if (flagEafter) flag = true;
} else {
flag = false;
}
}
return flag;
}
public static boolean isDigit(char ch) {
if (ch>='0'&&ch<='9') return true;
return false;
}
}