题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
思路1(枚举法):表示数值的字符串遵循模式A[.[B]][e|EC],其中A为数值的整数部分,B为小数部分,C为指数部分。A和C都可以为'+'或'-'开头,B前面不能有正负号,A、B、C都是0~9的数位串,A可有可无。
package offer;
import java.util.Scanner;
public class Solution20 {
public static boolean isNumeric(char[] str) {
int index = 0;
if (str == null || str.length <= 0)
return false;
if (str[0] == '+' || str[0] == '-')
index++;
// 只有'+'和'-'符号,是不能表示一个数的
if (index == str.length)
return false;
// 扫描后面0~9的数位串长度
index = scanDigits(str, index);
if (index < str.length) {
if (str[index] == '.') {
index++;
index = scanDigits(str, index);
if (index < str.length - 1) {
if (str[index] == 'e' || str[index] == 'E') {
index++;
return isExponential(str, index);
}
return false;
}
return true;
} else if (str[index] == 'e' || str[index] == 'E') {
index++;
return isExponential(str, index);
}
return false;
}
return true;
}
private static boolean isExponential(char[] str, int index) {
if (index < str.length) {
if (str[index] == '+' || str[index] == '-')
index++;
index = scanDigits(str, index);
if (index == str.length)
return true;
}
return false;
}
// 扫描0~9的数位串
private static int scanDigits(char[] str, int index) {
while (index < str.length && str[index] >= '0' && str[index] <= '9')
index++;
return index;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println("请输入字符串:");
String str=scanner.next();
System.out.println(isNumeric(str.toCharArray()));
}
}
思路2(正则表达式)
public class Solution {
public boolean isNumeric(char[] str) {
String string = String.valueOf(str);
return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?");
}
}
matches()如何表示正则表达式