Мне нужно проверить, если std::string
это число. Под номером я подразумеваю либо целое число, либо число с десятичной точкой (основание 10).
Я в порядке с ограничениями, которые long long
обеспечивает так что-нибудь за пределами, что меня не волнует. У меня нет повышения, но я скопировал lexical_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;
}
РЕДАКТИРОВАТЬ
число с плавающей запятой
Я не использую C ++ 0x / C ++ 11, поэтому я не могу использовать регулярные выражения для простой проверки числа с плавающей запятой. И я пытаюсь НЕ разбирать строку самостоятельно, поскольку это просто означает, что мне нужно провести больше юнит-тестов, чтобы убедиться, что я ничего не пропустил.
С NaN я знаю, что у них есть собственность float1 != float1
но GCC облажается.
Задача ещё не решена.
Других решений пока нет …