表示数值的字符串
【题目】:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串**"+100",“5e2”,"-123",“3.1416"和”-1E-16"**都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
思路
考察的是:
模式匹配的策略
代码的完整性
我们首先分析一下子可能是数值的字符串的格式
在数值之前可能有一个表示正负的’-‘或者’+’。
接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的整数部分)。
如果数值是一个小数,那么在小数点后面可能会有若干个0到9的数位表示数值的小数部分。如果数值用科学计数法表示,接下来是一个’e’或者‘E’,以及紧跟着的一个整数(可以有正负号)表示指数。
表示数值的字符串遵循模式 A[.[B]][e|EC]或者.B[e|EC]
代码
package C字符串;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/2/19 0019 19:07
* 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
* 例如,字符串"+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的数位串,但前面不能有正负号
*
*判断一个字符串是否符合上述模式时,
* 首先应该尽可能多的扫描0~9的数位(有可能在起始处`+`或者`-`),也就是前面模式中表示数值整数的A部分
*
* 如果遇到小数点`.`,则开始扫描表示数值小数部分的B部分。
*
* 如果遇到`e`或者`E`,则开始扫描C部分
*
*
*
*
*/
public class Problem2 {
public static void main(String[] args) {
}
public boolean isNumeric(char[] str) {
if (null==str || str.length == 0)
return false;
//记录当前扫描字符的位置,因为要进行方法传参,所以用类类型;不用数字也可以,直接采用index即可
int[] index = new int[]{0};
// 记录是否满足条件
boolean isNumberic = false;
// 判断 A
isNumberic = isInteger(str,index);
/**
* 判断 . B
* A A. A.B 均符合条件
*/
if (index[0]<str.length && str[index[0]]=='.'){
index[0]++;
isNumberic = isUnsignedInteger(str,index) || isNumberic;//注意这里为什么要取值为||
}
// 判断 e C ,E 后面必须有数字
if (index[0]<str.length && (str[index[0]]=='e' || str[index[0]]=='E')){
index[0]++;
isNumberic = isInteger(str,index) && isNumberic;//注意这里取值为&&;为什么取ee
}
if (isNumberic && index[0] == str.length){
return true;
}else {
return false;
}
}
// 判断输入的字符串是否包含一个无符号整数
private boolean isUnsignedInteger(char[] str,int[] index){
int start = index[0];
while (index[0]<str.length && str[index[0]]>='0' && str[index[0]]<='9' ){
index[0]++;
}
if (index[0] > start){
return true;
}else {
return false;
}
}
// 判断输入的是否包含一个数字
private boolean isInteger(char[] str,int[] index){
if (index[0]<str.length && (str[index[0]]=='-' || str[index[0]]=='+')){
index[0]++;
}
return isUnsignedInteger(str,index);
}
}