废话不多说直接上代码,此函数不做参数的校验,传入之前请先自己确保参数的可靠性;
double str2double(const char *src)
{
double ret = 0, sign = 1;
char *p = (char *)src;
//处理符号位
if (*p == '+')
{
sign = 1;
p++;
}
else if (*p == '-')
{
sign = -1;
p++;
}
while (*p && (*p != '.'))//处理整数部分
{
ret *= 10;
ret += (*p) - '0';//将字符转为数字并累计
p++;//移动指针
}
if (*p == '.')//存在小数的情况
{
double step = 0.1; //用来标识位数
p++; //略过小数点
while (*p)//处理小数部分,如果没有E就直接到结束
{
double step2 = 1;
if (*p == 'E'||*p == 'e')//比如说323.443E-03;
{
p++;//跳过E或者e;
if (*p == '+')
{
p++;//跳过+
int temp = atoi(p);
while (temp--)
{
step2 *= 10;
}
}
else if (*p == '-')
{
p++;//跳过-
int temp = atoi(p);
while (temp--)
{
step2 /= 10;
}
}
ret *= step2;
break;
}
ret += step*((*p) - '0');
step /= 10;
p++;
}
}
return ret*sign; //不要忘记符号位
}