请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。
第一种解法
/*
以下对正则进行解释:
[\\+\\-]? -> 正或负符号出现与否
\\d* -> 整数部分是否出现,如-.34 或 +3.34均符合
(\\.\\d+)? -> 如果出现小数点,那么小数点后面必须有数字;
否则一起不出现
([eE][\\+\\-]?\\d+)? -> 如果存在指数部分,那么e或E肯定出现,+或-可以不出现,
紧接着必须跟着整数;或者整个部分都不出现
*/
package HWday05;
public class HW05 {
public boolean isNumeric(char[] str) {
String string = String.valueOf(str) ;
return string.matches("[\\+\\-]?\\d*(\\.\\d+)?([eE][\\+\\-]?\\d+)?");
}
}
第二种解法
public class Solution {
public boolean isNumeric(char[] str) {
// 过滤特殊情况
if(str == null || str.length == 0)
return false;
// 这里注意几个细节
// 1、特殊字符可以是+-.eE,其中+-.可以出现在开头
// 2、.在数字中只能出现一次
// 3、+-可以在eE后面再出现一次
// 4、e只能在数字或.的后面出现
// 5、e不能出现在末尾
// 6、不能只出现+-或者.
// 7、不能出现上述的几个特殊字符意外的字符
int start = 0;
boolean dot = false, sign = false, hasE = false;
if(!Character.isDigit(str[0])){
if(str[0] == '+' || str[0] =='-'){
sign = true;
start++;
}else if(str[0] == '.'){
dot = true;
start++;
}else
return false;
}
if(start == str.length - 1)
return false;
for(int i = start; i < str.length; i++){
if(Character.isDigit(str[i]))
continue;
else if(str[i] == '+' || str[i] == '-'){
if(sign)
return false;
else if(str[i - 1] == 'E' || str[i - 1] == 'e')
sign = true;
else return false;
}else if(str[i] == '.'){
if(dot)
return false;
dot = true;
}else if(str[i] == 'e' || str[i] == 'E'){
if(hasE || i == str.length - 1)
return false;
else if(str[i - 1] == '.' || Character.isDigit(str[i - 1])){
hasE = true;
sign = false;
dot = true;
}else return false;
}else
return false;
}
return true;
}
}
第三种解法
public class Solution {
boolean isNumeric(char[] s) {
if(s.length==0) return false;
if((s.length==1)&&(s[0]<'0'||s[0]>'9')) return false;
if(s[0]=='+'||s[0]=='-'){
if(s.length==2&&(s[1]=='.')) return false;
}else if((s[0]<'0'||s[0]>'9')&&s[0]!='.') return false;//首位既不是符号也不是数字还不是小数点,当然是false
int i = 1;
while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
if(i<s.length&&s[i]=='.'){
i++;
//if(i>=s.length) return false;
while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
}
if(i<s.length&&(s[i]=='e'||s[i]=='E')){
i++;
if((i<s.length)&&(s[i]=='+'||s[i]=='-')){
i++;
if(i<s.length) while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
else return false;
}else if(i<s.length){
while((i<s.length)&&(s[i]>='0'&&s[i]<='9')) i++;
}else return false;
}
if(i<s.length) return false;
return true;
}
}
第四种解法、
public boolean solution(char[] str){
//排除特殊情况
if(str == null || str.length ==1 ) return false;
char pre = ' ';
int dotNum = 0;
int eNum = 0;
for(int i = 0; i<str.length; i++){
char c = str[i];
if(isNum(c)){ //如果是数字,数字前面可以是任何合法字符
pre = c;
continue;
}
if(isSign(c)){ //如果是加减符号,那么只能出出现在首位或者e后面
if(pre == ' ' || isE(pre)){
pre = c;
} else {
return false;
}
continue;
}
if(isE(c)){ //如果是e 只能出现在数字后面,且最多有一个
if(isNum(pre) && eNum <1){
pre = c;
eNum++;
dotNum++; //e后面就不能有'.'了
} else {
return false;
}
continue;
}
if(isDot(c)){ //如果是 . 那么只能出现在数字后面,且最多只有一个
if((isNum(pre) || isSign(pre)) && dotNum<1){
pre = c;
dotNum++;
} else {
return false;
}
continue;
}
return false; //其它都是非法字符
}
//验证最后一个元素
if(isNum(str[str.length-1])){ //验证下最后一个是否为数字
return true;
}
return false;
}
private boolean isNum(char c){
return (c >= 48 && c<=57);
}
private boolean isSign(char c){
return (c=='-' || c=='+');
}
private boolean isE(char c) {
return (c == 'e' || c== 'E');
}
private boolean isDot(char c){
return c=='.';
}