Есть ли функция stl или boost, чтобы определить, является ли строка числовой?
Я очень новичок в С++, повышаю и т.д.
Я хотел бы знать, есть ли уже функция boost или STL, которую я могу использовать, чтобы определить, является ли строка числовой.
Числовые строки могут выглядеть так:
100
или
100.52
Я знаю, что есть множество примеров, как написать такую функцию, но я хотел бы знать, есть ли уже функция, которую я могу использовать для этого.
Я ищу чистое С++-решение, а не C.
[UPDATE:
Я уже использую lexical_cast для преобразования строк, мне просто интересно, есть ли такой метод, как is_numeric, который я могу использовать для этого...]
Ответы
Ответ 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 @Цзянь Ху пустая строка числовая?