📄 stod.cpp
字号:
//stod.cpp
#include "mycommon.h"
#include "stod.h"
#include <windows.h>
//函数定义
double atod(const char* str, int* pReturn)
{
int flag = 1;
int flag_exp = 1;
double exp = 0.0;
double reti = 0.0;
double retf = 0.0;
double ret = 0.0;
char* buf = new char[strlen(str) + 1];
lstrcpy(buf, str);
trim(buf);
//检查字符串是否符合标准
if(!StringTest(buf))
{
if(pReturn)*pReturn = 0;
return 0.0;
}
int index = 0;
int len = strlen(buf);
//负数
if(buf[0] == '-')
{
flag = -1;
index = 1;
}
else if(buf[0] == '+')
{
flag = 1;
index = 1;
}
//处理整数部分
while(index < len && IsNumeric(buf[index]))
{
reti = reti * 10 + buf[index++] - 48;
}
//printf("%f\n", reti);
//处理小数部分(如果有)
if(index < len && buf[index] == '.')
{
//printf("retf\n");
index++;
double e = 1;
while(index < len && IsNumeric(buf[index]))
{
e = e/10;
retf = retf + (buf[index++] - 48) * e;
}
}
//printf("%f\n", retf);
//处理指数部分(如果有)
if(index < len && (buf[index] == 'E' || buf[index] == 'e'))
{
index++;
if(buf[index] == '-')
{
flag_exp = -1;
index++;
}
else if(buf[index] == '+')
{
flag_exp = 1;
index++;
}
while(index < len && IsNumeric(buf[index]))
{
exp = exp * 10 + buf[index++] - 48;
}
exp = exp * flag_exp;
}
//printf("%f\n", exp);
ret = (reti + retf) * pow(10, exp) * flag;
if(pReturn)*pReturn = 1;
delete[] buf;
return ret;
}
int StringTest(const char* str)
{
if(str == NULL) return 0;
if(strlen(str) == 0) return 0;
int i = 0;
int len = strlen(str);
int id = 0, ie = 0;//小数点和E出现的次数
if(IsNumeric(str))
return 1;//成功
//如果第一个字符不是数字或减号
if((str[0] != '-') && (str[0] != '+') && !IsNumeric(str[0]))//失败
return 0;
for(i=1; i<len; i++)
{
if(i == len - 1)
{
if(!IsNumeric(str[i]))
return 0;
}
//
if(str[i] == '.')
{
//E后面不能有小数点
//数中不能有两个小数点
if(ie > 0 || id > 0)return 0;
//小数点前后必须是数字
if(!IsNumeric(str[i-1]) || !IsNumeric(str[i+1]))
{
return 0;
}
id ++;
}
else if((str[i] == 'e') || (str[i] =='E'))
{
//一个数中只能有一个E
if(ie > 0) return 0;
//E前必须是数字,E后必须是数字或加减号
if(!IsNumeric(str[i-1]) ||
(!IsNumeric(str[i+1]) &&
(str[i+1] != '-') &&
(str[i+1] != '+')))
{
return 0;
}
ie++;
}
//此时出现的减号或加号只可能在指数部分,即E后面
else if((str[i] == '-') || (str[i] == '+'))
{
//加减号前面必须是E,加减号后面必须是数字
if(((str[i-1] != 'e') && (str[i-1] != 'E')) || !IsNumeric(str[i+1]))
{
return 0;
}
}
else if(!IsNumeric(str[i]))
{
return 0;
}
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -