题目描述
表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
源码
class Solution {
public:
bool isConNum(char str[],int l,int r)//判断为是否为不带符号的数字
{
for(int i=l;i<=r;i++)
{
if(str[i]<'0' || str[i]>'9')
return false;
}
return true;
}
bool isPositiveInteger(char str[],int l,int r)//判断是否为正整数或零
{
if(l == r )
{
if(str[l]>='0' && str[l]<='9') return true;
return false;
}
if(str[l] == '+')
{
return isConNum(str,l+1,r);
}
else
{
return isConNum(str,l,r);
}
}
bool isNegativeInteger(char str[],int l,int r)//判断是否为负整数
{
if(str[l] == '-')
{
return isConNum(str,l+1,r);
}
return false;
}
bool isInteger(char str[],int l,int r)
{
return isPositiveInteger(str,l,r) ||isNegativeInteger(str,l,r);
}
bool isSmallNumber(char str[],int l ,int r)//判断是否是为小数
{
int ind_point = 0;//记录第一个小数点出现的位置;
for(int i = l;i<=r;i++)
{
if(str[i]=='.')
{
ind_point = i;
break;
}
}
if(ind_point == l || ind_point == r)//若小数点出现在首尾,则不是小数
{
return false;
}
//若出现在字符串中间,则判断其左侧是否为整数且右侧为不带符号的整数。
return isInteger(str,l,ind_point-1)&&isConNum(str,ind_point+1,r);
}
bool isFE(char str[],int l,int r)
{
int ind_e = 0;
for(int i = l;i<= r;i++)
{
if(str[i] == 'e'|| str[i] == 'E')
{
ind_e = i;
break;
}
}
if(ind_e == l || ind_e == r)//若e出现在首尾,则不是PE.
{
return false;
}
//若e出现在字符串中间,则判断其左侧是否为整数且右侧为整数
return (isInteger(str,l,ind_e-1)||isSmallNumber(str,l,ind_e-1))&&isInteger(str,ind_e+1,r);
}
bool isNumeric(char* string)
{
int size = 0;
char * p = string;
while(*p != '\0')
{
p++;
size++;
}
if(size == 0) return false;
return isInteger(string,0,size-1)||isSmallNumber(string,0,size-1)||isFE(string,0,size-1);
}
};