Вы можете использовать Boost Spirit Числовые парсеры или (ab) использовать Boost Lexicalcast.
Boost Spirit позволяет детально контролировать принятый формат, см., Например,
Вот краткая демонстрация, в которой также показано, как можно определить несколько возможных числовых форматов ввода ( постепенно ) и вернуть соответствующий тип. Конечно, это может быть излишним, но это должно продемонстрировать, как дальше использовать Дух.
Демонстрация также показывает, как продвинуть итератор ввода, чтобы вы могли легко продолжить синтаксический анализ там, где закончился числовой ввод.
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
enum numeric_types
{
fmt_none,
fmt_float,
fmt_double,
fmt_uint,
fmt_int,
// fmt_hex, etc.
};
template <typename It>
bool is_numeric(It& f, It l, numeric_types& detected)
{
return qi::phrase_parse(f,l,
qi::uint_ [ qi::_val = fmt_uint ]
| qi::int_ [ qi::_val = fmt_int ]
| qi::float_ [ qi::_val = fmt_float ]
| qi::double_ [ qi::_val = fmt_double ]
,qi::space, detected);
}
template <typename It>
bool is_numeric(It& f, It l)
{
numeric_types detected = fmt_none;
return is_numeric(f, l, detected);
}
int main()
{
const std::string input = "124, -25, 582";
std::string::const_iterator it = input.begin();
bool ok = is_numeric(it, input.end());
if (ok)
{
std::cout << "parse success\n";
if (it!=input.end())
std::cerr << "trailing unparsed: '" << std::string(it,input.end()) << "'\n";
}
else
std::cerr << "parse failed: '" << std::string(it,input.end()) << "'\n";
return ok? 0 : 255;
}