Подтвердить что ты не робот

Есть ли функция stl или boost, чтобы определить, является ли строка числовой?

Я очень новичок в С++, повышаю и т.д.

Я хотел бы знать, есть ли уже функция boost или STL, которую я могу использовать, чтобы определить, является ли строка числовой.

Числовые строки могут выглядеть так: 100

или

100.52

Я знаю, что есть множество примеров, как написать такую ​​функцию, но я хотел бы знать, есть ли уже функция, которую я могу использовать для этого.

Я ищу чистое С++-решение, а не C.

[UPDATE: Я уже использую lexical_cast для преобразования строк, мне просто интересно, есть ли такой метод, как is_numeric, который я могу использовать для этого...]

4b9b3361

Ответ 1

Нет, нет готового способа сделать это напрямую.

Вы можете использовать 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 not a number.
    }

Ответ 2

boost::regex (или std::regex, если у вас есть С++ 0x); вы можете определить, что вы хотите принять (например, в вашем контексте, "0x12E" число или нет?). Для целых чисел С++:

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

С плавающей запятой С++:

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

Но в зависимости от того, что вы делаете, вам может не понадобиться поддерживать сложные вещи. Два примера, которые вы цитируете, будут покрытый

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

например.

Если вам понадобится числовое значение позже, оно также может быть так же легко преобразовать строку в istringstream, и сделайте конверсию немедленно. Если нет ошибки, и вы извлечь все символы, строка была числом; если не, это не так. Это даст вам меньше контроля над точным формат, который вы хотите принять.

Ответ 3

Если производительность является проблемой, я бы использовал boost. spirit qi, а не 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;
}

Ответ 4

Используйте stringstream и верните true, если конвертация "съела" все символы в исходной строке (= eof()).

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

Ответ 5

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;
}

Источник

Ответ 6

Вы можете попробовать lexical_cast в строке.

Ответ 7

Следующий код

В следующем предложении вернуть true, если "str" состоит только из 0 ~ 9, в противном случае вернуть false.

вернуть str.find_first_not_of ("0123456789") == std :: string :: npos

Ответ 8

Повышение не требуется, только stl... Один символ может быть проверен как int (c> = '0' && c <= '9'), find_if_not найдет первый символ, не соответствующий условию между [first] и [последний]. Если совпадений не найдено, возвращается [последний].

Если дополнительные символы, такие как пробел, должны быть проверены, добавьте их.

#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)
                );
}

PS @Цзянь Ху пустая строка числовая?