面试题20:表示数值的字符串
题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是
思路:
表示数值的字符串需遵循模式:A[.[B]][e|EC]或.B[e|EC]
A为数值的整数部分,
B跟着小数点的部分,为数值的小数部分
C紧跟着e或者E,为数值的指数部分
小数里可能没有整数部分,若一个数没有整数部分,则其必须有小数部分
A和C都可能是以正负号开头的0~9数位串
B也是0~9的数位串,但是不能有正负号
方法:
若以‘+’或‘-’开头,跳过,判断A,扫描0~9的数位,直到遇到‘.’或者‘e/E’
如果遇到‘.’,则开始判断小数部分B,
遇到e或者E,则开始判断指数部分C
需要注意的异常情况:以‘.’结尾,以‘e’结尾
import java.util.Scanner;
public class Q20 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("input your number:");
String str = "";
if(sc.hasNextLine()) {
str = sc.nextLine();
}
System.out.println(tellNumber(str));
}
public static boolean tellNumber(String str) {
int len = str.length();
int loc = 0;
if(str.length()==0) {return false;}
if(str.charAt(0)=='+' || str.charAt(0)=='-') {loc++;}
// 判断A
if(str.charAt(loc)!='.') {
loc = tellAorC(loc,str);
if(loc==-1) {return false;}
if(loc==str.length()) { return true;}
}
// 判断B
if(str.charAt(loc)=='.') {
loc++;
loc = tellB(loc,str);
if(loc==-1) {return false;}
if(loc==str.length()) {
return true;
}
}
// 判断C
if(str.charAt(loc)=='e' || str.charAt(loc)=='E'){
loc++;
if(loc==str.length()) {return false;}
loc = tellAorC(loc,str);
if(loc==-1) {return false;}
if(loc!=str.length()) {
return false;
}
}
return true;
}
// 判断B
public static int tellB(int loc,String str) {
if(loc==str.length()) {return -1;}
while(loc<str.length()) {
char c = str.charAt(loc);
if(c>='0' && c<='9') {
loc++;
}else {
if(c!='e' && c!='E') {
return -1;
}else {
break;
}
}
}
return loc;
}
// 判断A或C
public static int tellAorC(int loc,String str) {
char c = str.charAt(loc);
// 如果以正负号开始,则跳过
if(c=='+'||c=='-') {loc++;}
// 判断是否都是数字 如果不是 是否为.或者e/E
while(loc<str.length()) {
c = str.charAt(loc);
if(c >='0' && c<='9') {
loc++;
}else {
if(c!='.' && c!='e' && c!='E') {
return -1;
}
break;
}
}
return loc;
}
}