需要格外注意的一点是e如果存在,则前面至少有一个数字存在!!!
具体代码如下:
package com.zhumq.leetcode;
import java.util.Scanner;
import org.junit.Test;
public class StringIsNumeric {
/**
* 解法1:根据字符串中每个字符进行判断分析
*/
public boolean stringIsNumeric1(String s) {
char[] str = s.toCharArray();
//标记符号、小数点、e是否出现过
boolean sign=false,decimal = false,hasE = false,hasNum = false;
for(int i = 0;i<str.length;i++) {
//判断e前面是否有数字出现
if(str[i]>='0'&& str[i]<='9') {
hasNum = true;
}
/*
* 1. 判断'e'和'E'
*/
//e后面一定要接数字
if(str[i] == 'e' || str[i] == 'E') {
if(!hasNum || i == str.length -1) return false;//e后面一定要有数字
if(hasE) return false;//e只能存在一个
hasE = true;
/*
* 2. 判断'+'和'-'
*/
}else if(str[i] == '+' || str[i] == '-') {
//第二次出现+或-时,必须是紧跟在e后面
if(sign&&str[i-1] != 'e' &&str[i-1]!='E') return false;
//第一次出现+或-时,如果不是在字符串开头则一定要在e后面
if (!sign && i > 0 && str[i - 1] != 'e' && str[i - 1] != 'E') return false;
sign = true;
/*
* 3. 判断'.'
*/
}else if(str[i] == '.') {
//e后面不能有小数点
//小数点不能出现两次,当hasE=false时判断deciaml,如果前面已经有小数点即decimal=true则返回false
if(hasE || decimal) return false;
decimal = true;
/*
* 4. 判断是否为数字
*/
}else if(str[i]<'0'||str[i]>'9') {
return false;
}
}
return true;
}
/**
* 解法2:利用系统自身的校验系统
* @param s
* @return
*/
public boolean stringIsNumeric2(String s) {
//转换出现异常时返回false
try {
double number = Double.parseDouble(s);
System.out.println(number);
}catch(NumberFormatException e) {
return false;
}
return true;
}
/**
* 解法3:根据正则表达式匹配来确定是否符合!!!
* [\\+\\-]? 正或负符号出现与否
* \\d+ 整数部分是否出现,如-.34 或 +3.34均符合
* (\\.\\d+)? 如果出现小数点,那么小数点后面必须有数字;否则一起不出现
* ([eE][\\+\\-]?\\d+)? 如果存在指数部分,那么e或E肯定出现,+或-可以不出现,紧接着必须跟着整数或者整个部分都不出现
*/
public boolean stringIsNumeric3(String s) {
return s.matches("[\\+\\-]?\\d+(\\.\\d+)?([eE][\\+\\-]?\\d+)?");
}
@Test
public void test1() {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
String s = sc.next();
System.out.println(stringIsNumeric1(s));
}
sc.close();
}
}