/**
* @brief: 从ptr开始扫描字符串,过滤到前面的空格,直到数字或者“+”、“-”号,
* 才开始转换。如果遇到非数字以及字符串结束符'\0'时,结束转换。
* ptr字符串包含,正负号、数字或者E(e)标示指数部分,如123.456或者123e-2
* @argument: _ptr,需要转换的字符串
* @return: 转换后的浮点型数
*/
double myatof(const char* _ptr)
{
double fVal = 0.0, fPower = 1.0;
if(!_ptr)
return fVal;
// 过滤空格
int i = 0;
for(; isspace(_ptr[i]); ++i);
// 处理+-
int nSign1 = (_ptr[i] == '-') ? -1 : 1;
if( (_ptr[i] == '+' ) || (_ptr[i] == '-') )
++i;
// 处理 小数点前
for(; isdigit( _ptr[i] ); ++i)
fVal = fVal * 10 + (_ptr[i] - '0');
// 处理 小数点
if(_ptr[i] == '.')
++i;
// 处理 小数点前
for(; isdigit( _ptr[i] ); ++i)
{
fPower *= 10;
fVal = fVal * 10 + (_ptr[i] - '0');
}
fVal = fVal / fPower;
// 处理e 指数
if((_ptr[i] == 'E') || (_ptr[i] == 'e') )
{
double fVal2 = 0.0;
int nSign2 = (_ptr[++i] == '-') ? -1 : 1;
if( (_ptr[i] == '+' ) || (_ptr[i] == '-') )
++i;
for(; isdigit( _ptr[i] ); ++i)
fVal2 = fVal2 * 10 + (_ptr[i] - '0');
if(nSign2 == 1)
fVal = fVal * pow(10, fVal2);
else
fVal = fVal / pow(10, fVal2);
}
return fVal;
}