表达数值的字符串
题目:
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但是“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。
这里我们先补存一个知识点1e2,表示1*10^2。
我们可以将这个字符串划分为如下的形式A[.[B]][e|EC]或者.B[e|EC]两种形式。
A 表示整数部分
,可以没有,也可以带“+“、”-”号
B 表示小数部分,如果没有整数就必须要有小数部分。
C 表示指数部分。
我们先来找规律和分析问题,扫描数字的时候我们是同一个函数,我们就可以写一个专门扫描数字的函数,来提高代码的质量,提高代码的使用效率,避免重复的写同一函数。
bool scanfInteger(const char**str)
{
if(**str=='+'||**str=='-')
++(*str);
return sanUnsigned(str);
}
bool sanUnsigned(const char **str)
{
const char *before ==*str;
while(**str!='\0'&&**str>='0'&&**str<='9')
++(*str);
return *str>before;
}
bool isNumeric(const char*str)
{
if(str==NULL)
return false;
bool numberic=scanfInteger(&str);
if(*str=='.')
{
++str;
numberic=scanfInteger(&str)||numeric;
//.123=0.123 整数部分没有
//123.=123.0 小数部分没有
//123.11 小数和整数都有
}
if(*str=='e'||*str=='E') //如果出现e||E即为指数部分
{
++str;
numberic=scanfInteger(&str)&&numeric;
}
return numberic && *str=='\0';
}