环境:Window7 x64,VS2015
内容:
今天写代码,需要判断string 是否是 double值 ,例: "0.01" 是 double值
本来我以为很简单的,就是 string 先转 double, 然后再转 string ,最后判断转换前后 string 是否相等就可以了!
于是我写了一个函数,如下:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
double StrToDouble(string str)
{
if (str.empty())
return 0;
std::istringstream iss(str);
double d = 0;
iss >> d;
return d;
}
string DoubleToStr(double value)
{
char str[133] = { 0 };
sprintf_s(str, "%g", value);
return std::string(str);
}
bool IsDoubleString(std::string value)
{
std::string text = DoubleToStr(StrToDouble(value));
if (text != value)
{
return false;
}
return true;
}
int main()
{
bool a = IsDoubleString("0.01");
bool b = IsDoubleString("0.000001");
return 0;
}
测试发现:a = true, b= false......
这是因为0.000001太小了,它的double值是1e-6,再转成string时就是 1e-6 ,和 0.000001 就不相等了。
所以通过转换两次来判断是否是double值,不适用于科学计数法,是错误的!
结论:百度了好多方法,都有缺陷, 最后谷歌搜到下面这个方法,既正确又简单。
(学C++的小伙伴一定要熟悉stackoverflow,太有用了!!!)
#include <iostream>
#include <string>
using namespace std;
bool IsDoubleString(const std::string& s)
{
char* end = 0;
double val = strtod(s.c_str(), &end);
return end != s.c_str() && *end == '\0' && val != HUGE_VAL;
}
int main()
{
bool a = IsDoubleString("0.01");
bool b = IsDoubleString("0.000001");
bool c = IsDoubleString("1.9E-9");
return 0;
}