我需要检查一个std::string
是否是一个数字。数字是指整数或带小数点的数字(以 10 为底)。
我对long long
提供我不关心的任何东西的限制感到满意。我没有boost,但复制了lexical_cast
.
似乎强制转换double
以验证字符串确实有效,但我想知道是否有任何我没有想到的极端情况。
#include <typeinfo>
#include <sstream>
template<typename Out, typename In> static Out lexical_cast(In input)
{
stringstream ss;
ss << input;
Out r;
if ((ss >> r).fail() || !(ss >> std::ws).eof())
{
throw std::bad_cast();
}
return r;
}
bool is_numeric(const string in)
{
bool success = false;
try
{
lexical_cast<double>(in);
success = true;
}
catch(std::bad_cast &exc)
{
success = false;
}
return success;
}
编辑
浮点数
我没有使用 C++0x/C++11,所以我不能使用正则表达式来轻松验证浮点数。而且我试图不必自己解析字符串,因为这意味着我必须进行更多的单元测试以确保我没有遗漏任何东西。
有了 NaN,我知道他们有这个属性float1 != float1
,但是 GCC 搞砸了。