实现一个函数用来判断字符串是否表示数值(包括整数和小数)
例如:
字符串"+100"、“5e2”、"-123"、“3.1416”、"-1E-16"、"0123"等表示数值,
“12e”、“1a3.14”、“1.2.3”、"±5"及"12e+5.4"都不是
判断是否为数字型字符串模块C代码:
bool isNumber(char* s)
{
int i=0,n=0,k=0,t=0;
for(i=0;s[i]==' ';++i); //跳过字符串开头空格
if(s[i]=='e'||s[i]=='E') //空格之后是‘e’或‘E’返回非数字型
return false;
while(s[i]!='\0'&&(s[i]<'0'||s[i]>'9')) //判断剩余字符是否有数字
++i;
if(s[i]=='\0') //无数字返回非数字型
return false;
for (i=0;s[i]!='\0';++i)
{
while(s[i]==' ') //跳过字符串开头空格
++i;
if(s[i]=='\0') //字符串访问结束退出循环
break;
if(s[i]=='.') //处理小数点
{
if(k==0) //访问该小数点前未出现小数点
++k; //记录小数点标志位加1
else //出现则返回非数字型
return false;
if(((s[i+1]<'0'||s[i+1]>'9')&&s[i+1]!='\0')||t>0) //小数点之后非数字且小数点不是最后一个字符或者‘e’或‘E’个数大于1
return false; //返回非数字型
}//if
else if(s[i]=='+'||s[i]=='-') //处理‘+’‘-’
{
if(n<2) //访问之前‘+’‘-’出现次数小于2,标志位加1
++n;
else //返回非数字
return false;
if((s[i+1]<'0'||s[i+1]>'9')&&s[i+1]!='.') //‘+’‘-’之后不是小数点或数字
return false; //返回非数字型
}//else if
else if(s[i]=='e'||s[i]=='E') //处理‘e’‘E’
{
if(t<1) //访问之前‘e’‘E’出现次数小于1,标志位加1
++t;
else //返回非数字型
return false;
if((s[i+1]<'0'||s[i+1]>'9')&&s[i+1]!='+'&&s[i+1]!='-') //‘e’‘E’之后不是‘+’或‘-’或数字
return false;
}//else if
else if(s[i]>='0'&&s[i]<='9') //返回非数字型
{
while(s[i+1]==' '&&s[i+1]!='\0') //处理数字之后的空格
{
++i;
if((s[i+1]>='0'&&s[i+1]<='9')||s[i+1]=='.'||s[i+1]=='e'||s[i+1]=='E') //空格之后为数字,小数点,‘+’,‘-’,‘e’,‘E’
return false; //返回非数字型
}//while
if(s[i+1]=='.'&&s[i+1]!='\0') //处理数字之后的小数点
{
++i;
++k; //小数点标志位加1
if(k>1||t>0) //小数点个数大于1或‘e’或‘E’个数大于0
return false; //返回非数字型
while(s[i+1]==' '&&s[i+1]!='\0') //处理小数点后的空格
{
++i;
if((s[i+1]>='0'&&s[i+1]<='9')||s[i+1]=='.'||s[i+1]=='e'||s[i+1]=='E') //空格之后为数字,小数点,‘+’,‘-’,‘e’,‘E’
return false; //返回非数字型
}//while
}//if
else if(s[i+1]=='+'||s[i+1]=='-') //数字之后为‘+’,‘-’
return false; //返回非数字型
}//else if
else
return false; //非以上字符返回非数字
}//for
return true; //循环结束放回数字型
}