剑指 Offer 20. 表示数值的字符串

剑指 Offer 20. 表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。

题解:
正确的规则:正负号只能出现在开头或者幂符号之后:小数点和幂符号最多出现一次,幂符号不能在开头或者结尾,字符串不能出现除'0' - '9''e/E''.''+''-'之外的字符。
循环读取字符串中的字符,拿出字符和'0' - '9''e/E''.''+''-'依次进行比较,看是否符合上述规则,如果不符合退出循环,返回 false


public static boolean isNumber(String s) {
		 
		String s1= s.trim();
		 //System.out.println(s1);
		if(s1.length()==0)return false;
		 int l=s1.length();
		 boolean isnum=true;
		 int dot=0;
		 boolean isD=false,isN=false;;
		 int e=0;
		 boolean isE=false;
		 char[] string=s1.toCharArray();
		 for(int i=0;i<l;i++)
		 {
			  //判断 '+'  '-'
	            if(string[i] == '+' || string[i] == '-'){
	                
	                //正负号只能出现在开头或者e后面
	                if(i == 0){
	                    
	                }
	                else{
	                    if(string[i-1] == 'e' || string[i-1] == 'E'){
	                        if(i == l - 1){
	                            isnum = false;
	                            break;
	                        }
	                    }
	                    else{
	                        isnum = false;
	                        break;
	                    }
	                }
	            }
	            // 判断小数点
	            else if(string[i] == '.'){
	                
	                dot ++;
	                isD=true;
	                //  '.' 不能出现在开始或末尾则
	                if(i == 0 &&l>1){
	                	if(string[1] >= '0' && string[1] <= '9') {
	                		
	                	}
	                	else {
	                		isnum= false;
	                    break;
	                	}
	                    
	                }
	                else if(i == l - 1&&l-2>=0) {
	                	if(string[l-2] >= '0' && string[l-2] <= '9') {
	                		
	                	}
	                	else {
	                		isnum= false;
	                    break;
	                	}
	                }

	                // '.' 只能出现一次
	                if(dot > 1){
	                    isnum= false;
	                    break;
	                }

	                // 不能在 'e/E' 之后出现
	                if(isE){
	                    isnum = false;
	                    break;
	                }
	            }
	            // 判断 'e' 'E'
	            else if(string[i] == 'e' || string[i] == 'E'){
	                
	                isE = true;
	                e ++;

	                // 'e/E' 只能出现一次
	                if(e > 1){
	                    isnum = false;
	                    break;
	                }

	                // 如果 'e/E' 出现在开始或末尾则出错
	                if(i == 0 || i == l - 1){
	                    isnum = false;
	                    break;
	                }
	            }
	            else{
	                // 如果字符不是 '0' - '9' 则报错    
	                if(string[i] >= '0' && string[i] <= '9'){
	                    isN=true;
	                }
	                else{
	                    isnum = false;
	                    break;
	                }
	            }
	        }
		 if(e==0&&isN==false&&dot==1)isnum=false;
		 if(l>2&&string[0]=='+'&&(string[1]=='e'||string[1]=='E'))isnum=false;
		 if(l>2&&string[0]=='-'&&(string[1]=='e'||string[1]=='E'))isnum=false;
		
		 return isnum;
		 
	    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值