表示数值的字符串

题目描述

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

思路:

以E或e为节点,将字符串分成前后两部分,前面的部分可以有小数点,后面的部分不能有小数点。去除正负号后,以小数点为界限再次将字符串分为前后两部分,判断每一部分是不是只有数字。

class Solution {
public:
    bool isNumeric(char* string)
    {
        if (string==NULL)
            return false;
        int i;
        vector<char>s1,s2;	//以E或e为节点,将字符串分为前后两部分
        for(i=0;;i++)		//找出E或e位置
        {
            if(*(string+i)=='E'||*(string+i)=='e'||*(string+i)=='\0')
                break;
        }
        
        if(*(string+i)=='E'||*(string+i)=='e')
        {
            for(int j=0;j<i;j++)
                s1.push_back(*(string+j));
            for(int j=i+1;*(string+j)!='\0';j++)
                s2.push_back(*(string+j));
            if(s1.size()==0||s2.size()==0)//字符串中存在E或e,那么E或e前后字符串不能为空
                return false;
            return IsNumOfFirst(s1)&&IsNumOfLast(s2);
        }
        else//(str[i]=='\0')
        {
            for(int j=0;j<i;j++)
                s1.push_back(*(string+j));
            return IsNumOfFirst(s1);
        }
    }
    
    bool IsNumOfFirst(vector<char> s)//用于判断E或e之前的字符串是否符合要求
    {
        int len=s.size();
        if(len==0)
            return false;
        string front="",last="";//以小数点为界限,将字符串分为前后两部分
        int havepoint=0;		//有没有小数点的标记
        if(s[0]=='+'||s[0]=='-')//第一个字符是正负号
        {
            //if(s[1]<'0'||s[1]>'9')//+.3合法,正负号后面可以直接跟小数点
             //   return false;
            int i; 
            for(i=1;i<len;i++)
            {
                if(s[i]=='.'){havepoint=1;break;}
                front=front+s[i];
            }
            i++;//越过小数点
            for(;i<len;i++)
                last=last+s[i];
            //if((front==""||last=="")&&havepoint==1)
            if(last==""&&havepoint==1)	//有小数点,小数点后面不能为空
                return false;
            if(front==""&&havepoint==0)	//不能只有一个正负号
                return false;
            return isnum(front) && isnum(last);
        }
        else //第一个字符不是正负号
        {
            int i;
            for(i=0;i<len;i++)
            {
                if(s[i]=='.'){havepoint=1;break;}
                front=front+s[i];
            }
            i++;//越过小数点
            for(;i<len;i++)
                last=last+s[i];
            //if((front==""||last=="")&&havepoint==1)
            if(last==""&&havepoint==1)//有小数点,小数点后面不能为空
                return false;
            //if(front==""&&havepoint==0)
              //  return false;
            return isnum(front) && isnum(last);
        }
    }
    //用于判断E或e之后的字符串是否符合要求
    bool IsNumOfLast(vector<char> vec)	//E或e之后一定没有小数点
    {
        int len=vec.size();
        if(len==0)
            return false;
        string s="";
        if(vec[0]=='+'||vec[0]=='-')	//第一个字符是正负号
        {
            for(int i=1;i<len;i++)
                s=s+vec[i];
            if(s=="")					//不能只有一个正负号
                return false;
        }
        else//第一个字符不是正负号
        {
            for(int i=0;i<len;i++)
                s=s+vec[i];
        }
        return isnum(s);
     }
    
    bool isnum(string str)//判断一串字符是不是由0-9字符构成
    {
        int len=str.size();
        for(int i=0;i<len;i++)
            if(str[i]<'0'||str[i]>'9')
                return false;
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值