WinCE 6.0下字符串转换为浮点数

来源:互联网 发布:数据采集与监控系统 编辑:程序博客网 时间:2024/06/08 05:12

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(intn=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;

 }