一、题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2",
"-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"
都不是。
二、题目分析
-
数值的格式:A[.[B]][e/EC] 或者 .B[e/EC]
- A:数值的整数部分
- B:紧跟着小数点后的小数部分
- C:紧跟着 e/E的指数部分
- A和C都可能是以“+”或者“-”开头的0~9;B是 0 ~9
-
判断步骤:
- 扫描整数A部分;
- 遇到小数点‘.’,开始扫描小数B部分
- 遇到‘e’ ‘E’,开始扫描指数C部分
三、代码实现
public class Solution {
private int index = 0; //字符数组指针
/**
* 判断字符串是否表示数字
*/
public boolean isNumeric(char[] str) {
//字符串判空
if(str.length < 1){
return false;
}
//扫描整数部分
boolean isNum = scanInteger(str);
//扫描小数部分
if(index<str.length && str[index]=='.'){
index++;
//小数可以没有整数部分
//小数点后边可以没有数字
//也可以小数点前后都有
isNum = scanUnsignedInteger(str) || isNum;
}
//扫描指数部分
if(index<str.length && (str[index]=='e'||str[index]=='E')){
index++;
//当e前无数字,不能表示数字
//当e后无数字,不能表示数字
isNum = isNum && scanInteger(str);
}
return (isNum && index==str.length);
}
/**
*扫描带正负号的0~9
*/
boolean scanInteger(char[] str){
if(index<str.length && (str[index]=='+'||str[index]=='-')){
index++;
}
return scanUnsignedInteger(str);
}
/**
*扫描字符串中0~9
*/
boolean scanUnsignedInteger(char[] str){
int start = index; //记录开始索引
while(index<str.length && str[index]>='0' && str[index]<='9'){
index++;
}
//当存在若干0~9,则返回true
return start<index;
}
}