Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;检查字符串是否为数字_C++_Lexical Cast - Fatal编程技术网

C++ C++;检查字符串是否为数字

C++ C++;检查字符串是否为数字,c++,lexical-cast,C++,Lexical Cast,我需要检查std::string是否是一个数字。我所说的数字是指整数或带小数点的数字(以10为基数) 我对long提供的任何超出我所不关心的限制都很满意。我没有boost,但是复制了词法\u cast 这似乎像是对double进行强制转换,以验证字符串是否确实有效,但我想知道是否有一些我没有想到的特殊情况 #include <typeinfo> #include <sstream> template<typename Out, typename In> st

我需要检查
std::string
是否是一个数字。我所说的数字是指整数或带小数点的数字(以10为基数)

我对
long
提供的任何超出我所不关心的限制都很满意。我没有boost,但是复制了
词法\u 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;
}
#包括
#包括
模板静态输出(输入中)
{
细流ss;
ss>r.fail()| |!(ss>>std::ws.eof())
{
抛出std::bad_cast();
}
返回r;
}
布尔是数字(常量字符串输入)
{
布尔成功=假;
尝试
{
词汇转换(in);
成功=真实;
}
捕捉(标准:错误的施法和换法)
{
成功=错误;
}
回归成功;
}

编辑

浮点数

我没有使用C++0x/C++11,因此无法使用正则表达式轻松验证浮点数。我尽量不必自己解析字符串,因为这意味着我必须进行更多的单元测试,以确保没有遗漏任何内容


对于NaN,我知道他们拥有属性
float1!=float1
但GCC会搞糟这一点。

转换为
double
可能会接受某些文本表示形式的无穷大或NaN。为什么要这么麻烦,而不是迭代字符串并检查它是否只包含数字,最多包含一个
(或小数点的其他表示形式)?和@NikBougalis的可能重复:仅数字,最多一个
,可能是一个
+
或一个
-
,也可能是一个
e
e
,然后是可选的另一个
+
-
和一些其他数字,但不是
。。。我忘了什么吗?@n.m.:那么你真的想确认这是一个F.P.号码?如果是这样,你已经复制了。