是否有stl或boost函数来确定字符串是否为数字?

时间:2011-04-07 08:09:03

标签: c++ boost stl

我是C ++,boost等人的新手。

我想知道在boost或STL中是否已经有一个函数可以用来确定字符串是否为数字。

数字字符串可能如下所示: 100

100.52

我知道有很多例子如何编写这样的函数,但我想知道是否已经有一个我可以使用的函数。

我正在寻找纯粹的C ++ - 解决方案,而不是C。

[UPDATE: 我已经在使用lexical_cast转换我的字符串了,我只是想知道是否有像is_numeric这样的方法可以用于此...]

9 个答案:

答案 0 :(得分:10)

不,没有现成的方法可以直接这样做。

您可以使用boost::lexical_cast<double>(your_string),如果它抛出异常,那么您的字符串不是双倍。

    bool is_a_number = false;
    try
    {
        lexical_cast<double>(your_string);
        is_a_number = true;
    }
    catch(bad_lexical_cast &)
    {
        // if it throws, it's not a number.
    }

答案 1 :(得分:8)

可以使用

boost::regex(或std::regex,如果你有C ++ 0x); 你可以定义你想接受的内容(例如在你的上下文中, “0x12E”是一个数字还是没有?)。对于C ++整数:

"\\s*[+-]?([1-9][0-9]*|0[0-7]*|0[xX][0-9a-fA-F]+)"

对于C ++浮点:

"\\s*[+-]?([0-9]+\\.[0-9]*([Ee][+-]?[0-9]+)?|\\.[0-9]+([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)"

但是根据你正在做的事情,你可能不需要 支持复杂的事情。你引用的两个例子就是

涵盖
"[0-9]+(\\.[0-9]*)?"

例如。

如果您稍后需要数值,也可能是 同样容易将字符串转换为istringstream,和 立即做转换。如果没有错误,那么你 提取所有字符,字符串是一个数字;如果不, 事实并非如此。这样可以减少对精确控制的控制 但是,你要接受的格式。

答案 2 :(得分:6)

如果完全关注性能,我会使用boostspiritqi而不是std::stringstream

#include <string>
#include <boost/spirit/include/qi_parse.hpp>
#include <boost/spirit/include/qi_numeric.hpp>

bool is_numeric(std::string const& str)
{
    std::string::const_iterator first(str.begin()), last(str.end());
    return boost::spirit::qi::parse(first, last, boost::spirit::double_)
        && first == last;
}

如果要允许尾随空格,请执行以下操作:

#include <string>
#include <boost/spirit/include/qi_parse.hpp>
#include <boost/spirit/include/qi_numeric.hpp>
#include <boost/spirit/include/qi_char_class.hpp>
#include <boost/spirit/include/qi_operator.hpp>

bool is_numeric(std::string const& str)
{
    std::string::const_iterator first(str.begin()), last(str.end());
    return boost::spirit::qi::parse(first, last,
            boost::spirit::double_ >> *boost::spirit::qi::space)
        && first == last;
}

答案 3 :(得分:3)

如果转换“占用”原始字符串中的所有字符(= stringstream),请使用true并返回eof()

bool is_numeric(const std::string& str) {
    std::stringstream conv;
    double tmp;
    conv << str;
    conv >> tmp;
    return conv.eof();
}

答案 4 :(得分:3)

bool is_numeric(std::string number)
{
    char* end = 0;
    std::strtod(number.c_str(), &end);

    return end != 0 && *end == 0;
}


bool is_integer(std::string number)
{
    return is_numeric(number.c_str()) && std::strchr(number.c_str(), '.') == 0;
}

Source

答案 5 :(得分:2)

您可以在字符串上尝试lexical_cast

答案 6 :(得分:1)

以下代码

以下语句,如果“ str”仅由0〜9组成,则返回true,否则返回false。

返回str.find_first_not_of(“ 0123456789”)== std :: string :: npos

答案 7 :(得分:1)

从C ++ 11开始,您可以简单地使用std::stofstd::stodstd::stold中的一个转换为floatdouble和{{1 }}, 分别。如果有问题,它们会将字符串转换为数值或引发异常(请参见the reference)。这是long double的示例:

std::stod

还介绍了将字符串转换为signedunsigned整数的函数。

答案 8 :(得分:0)

不需要助推器,只需stl ... 可以将单个字符检查为int类型(c> ='0'&& c <='9'),find_if_not将查找第一个不符合[first]和[last]条件的字符。如果没有找到匹配项,它将返回[last]。

如果应检查其他字符,例如空格,-,将其添加。

#include <string>
#include <algorithm>
bool isNumeric(std::string strValue) 
{
    if (strValue.empty())
        return false;
    else
        return (std::find_if_not( std::begin(strValue)
                            , std::end(strValue)
                            , [](char c)
                              { return (c >= '0' && c <= '9'); }
                            ) == std::end(strValue)
                );
}

P.S。 @Jian Hu是一个空字符串数字吗?