题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。
但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
分析:
在数值之前可能有一个表示正负的 ‘-’ 或者 ‘+’ ,后面紧跟着若干个0到9的数位表示数值的整数部分。
如果遇到小数点 ‘.’ ,那么在小数点后面可能会有若干个0到9的数位。
如果遇到 ‘e’ 或者 ‘E’ ,那么后面跟着一个整数,这个整数可能会带 ‘+’ ‘-’ 号,可能不带。
先看第一个字符是不是正负号。如果是,往后移动一个字符,继续扫描剩余的字符串中0到9的数位。如果是一个小数,则将遇到小数点。如果遇到’e’或者’E’,要判断后面是否有整数。
关于小数点:
小数可以没有整数部分 比如.123等于0.123
小数点后面可以没有数字,如233.等于233.0
小数点前后都可以有数字 比如1.2
定义两个方法
scanInteger(char[] str)//扫描可能以表示正负的'+'或者'-'为起始的0~9的数位
scanUnsignedInteger(char[] str)//扫描无符号的整数
代码实现
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
String string=sc.nextLine();
char[] str=string.toCharArray();
System.out.println(isNumeric(str));
}
}
static int index;
public static boolean isNumeric(char[] str){
index=0;
if(str==null||str.length==0){
return false;
}
boolean numeric=scanInteger(str);
//判断小数部分
if(index<str.length&&str[index]=='.'){
index++;
numeric=scanUnsignedInteger(str)||numeric;
}
//判断指数部分
if(index<str.length&&(str[index]=='e'||str[index]=='E')){
index++;
numeric=numeric&&scanInteger(str);
}
return numeric && index>=str.length;
}
//扫描无符号的整数
public static boolean scanUnsignedInteger(char[] str){
int before=index;
while(index < str.length && str[index] >= '0' && str[index] <= '9'){
index++;
}
return index>before;
}
//扫描可能以表示正负的'+'或者'-'为起始的0~9的数位
public static boolean scanInteger(char[] str){
if(index<str.length&&(str[index]=='+'||str[index]=='-')){
index++;
}
return scanUnsignedInteger(str);
}