题目描述:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100", "5e2", "-123"," 3.1416" 和 "-1E-16" 都表示数值。
但是 "12e", "1a3.14", "1.2.3", "+-5" 和 "12e+4.3" 都不是。
思路:
一个字符串只能出现一次e,且e不是最后一位; 小数点只能出现一次 ; +/- 只能在头/尾/e之后
而小数点只能出现在e前,如果出现在e后也就是指数部分,那么是错的,返回false。
代码实现
package 字符串;
class Stringlcz
{
public boolean solution(String s)
{
if(s==null)
return false;
boolean sign=false,decimal=false,hasE=false; //标记符号、小数点、指数符号E是否出现过
for(int i=0;i<s.length();i++)
{
if(s.charAt(i)=='e'||s.charAt(i)=='E') //E不能是最后一位,后面必须跟指数
{
if(i==s.length()-1)
return false;
if(hasE) //E只能出现一次
return false;
hasE=true;
}
else if(s.charAt(i)=='.')
{
if(hasE||decimal) //注意hasE如果是true,表示前面已经出现过e了,后面不能跟小数点了
return false;
decimal=true;
}
else if(s.charAt(i)=='+'||s.charAt(i)=='-')
{
if(!sign&&i!=0&&s.charAt(i-1)!='e'&&s.charAt(i-1)!='E') //!sign:保证在之前没有出现过正负号,确保正负号只出现一次。
return false;
if(sign&&s.charAt(i-1)!='E'&&s.charAt(i-1)!='e')
return false;
sign=true;
}
else if(s.charAt(i)>'9'||s.charAt(i)<'0')
return false;
}
return true;
}
public static void main(String[] args) {
Stringlcz l=new Stringlcz();
String s="-100";
String s1="12e+4.3";
String s2="1.23e4";
String s3="-789.01234";
String s4="+-12";
String s5="12E-4";
System.out.println(l.solution(s));
System.out.println(l.solution(s1));
System.out.println(l.solution(s2));
System.out.println(l.solution(s3));
System.out.println(l.solution(s4));
System.out.println(l.solution(s5));
}
}
运行结果: