float myatof(TCHAR * str) //输入的是一个以NULL结尾的字符串指针
{
float fRes=0;//整数部分
if(str) //指针不为空
{
float fDemic=0;//小数部分
int nDecimalCount=1;//小数位数*10
int nLen=_tcslen(str);//总共长度
if(nLen>30)
nLen=30; //再多位数考虑没有意义故从30位截
BOOL bExponential=FALSE;//是否科学记数法的指数E
BOOL bHaveradixpoint=FALSE;//是否有小数点, 并且控制只能有一个
BOOL bIsNegative=FALSE;//是否负数
double nEcount=0;//e后面的10的幂次值
for(int n=0;n<nLen;n++)
{
int nValue=str[n]-_T('0');//是否为数字
if(nValue<0 || nValue>9)
{
nValue=-1;
}
if(nValue!=-1)//如果是数字
{
if(!bExponential)//如果不是科学计数法
{
if(!bHaveradixpoint)
{
fRes=fRes*10+nValue;
}
else
{
fDemic=fDemic*10+nValue;
//不采用下面的方法,是/10+3/100!=0.23
//float ftemp=nValue;
// fRes=fRes+ftemp/nDecimalCount;;
//所以采用/100,它也不一定等于.23但确保等于.29-0.2999之间。
nDecimalCount*=10;
}
}
else//是指数
{
nEcount=nEcount*10+nValue;
}
}
else//如果不是数字
{
if(str[n]==_T('E') || str[n]==_T('e'))
{
if(bExponential)//已经有一个E了
break;
bExponential=TRUE;
}
else if(n==0 && str[n]==_T('-'))//如果是"-"号,并且只能在第一位
{
bIsNegative=TRUE;
}
else if(str[n]==_T('.'))
{
if(bHaveradixpoint==FALSE)
{
bHaveradixpoint=TRUE;
}
else
{
break;
}
}
else//其它各种符号都返回
{
break;
}
}
}//for
fRes=fRes+fDemic/nDecimalCount;
fRes*=pow((double)10,nEcount);
if(bIsNegative)
{
fRes*=-1;
}
}
return fRes;
}