表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是
表示数字的字符串遵循模式 [+ | - ] [ A ] [ . [ B ]] [ e | E C]
- 符号不是必须的,但是如果有的话,必须是 +或者-,而且后面必须跟数字
- 整数部分不是必须的,比如 .123 代表 0.123
- 小数部分不是必须的,但是如果有小数部分,就一定有小数点。比如 123. 代表 123.0 123e2
- 指数部分也不是必须的,但是如果有的话,后面必须接数字 比如 123e 就是不合法的
根据这个逻辑,我们一共进行了4个判断,分别判断:符号、数字、小数点、e和E
使用 int cur 和 boolean isNum , isNum 代表 在 cur 之前的数字是否合法。
public class Solution {
public int cur = 0;
public boolean isNumeric(char[] str) {
if(str == null || str.length == 0){
return false;
}
boolean isNum = signed(str);
if(cur < str.length && str[cur] == '.'){
cur++;
// 这里为什么用或。
// 第一个判断的是,从游标开始是否有数字
// 第二个判断的是,在小数点之前的,是否符合规则
// 由于小数点前、后面都可以没有数字,比如 .123 和 123.
isNum = unsignedInteger(str) || isNum;
}
if(cur < str.length &&(str[cur] == 'e' || str[cur] == 'E')){
cur++;
// 这里为什么用 与
// 第一个判断是,在e 和 E之前,是否符合规则
// 第二个判断是,e、E 后面是否有数字
// 由于在e和E前后都必须有数字,所以这里用 &&
isNum = isNum && signed(str);
}
return (isNum && cur == str.length);
}
public boolean unsignedInteger(char[] str){
int beforeCur = cur;
// 判断从游标开始有没有数字。
while(cur < str.length && str[cur] >= '0' && str[cur] <= '9'){
cur++;
}
// 有数字的话 返回true 没有数字的话 返回false
return (cur > beforeCur);
}
// 如果是正负号,则跳过,并且判断后面的是否是数字
public boolean signed(char[] str){
if(cur < str.length && (str[cur] == '+' || str[cur] == '-')){
cur++;
}
return unsignedInteger(str);
}
}
功能测试:正数或者负数、包含或者不包含整数部分的数值、包含或者不包含小数部分的数值、包含或者不包含指数部分的数值、各种不能表达有效数值的字符换
特殊输入测试:输入字符串是null、空指针
来源:https://blog.csdn.net/weixin_43928621/article/details/100767903