Другая версия ...
Используйте strtol
, оборачивая его в простую функцию, чтобы скрыть ее сложность:
inline bool isInteger(const std::string & s)
{
if(s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false;
char * p;
strtol(s.c_str(), &p, 10);
return (*p == 0);
}
Почему strtol
?
Насколько я люблю C ++, иногда C API - лучший ответ для меня:
- использование исключений является излишним для теста, который разрешен на неудачу
- создание временного объекта потока с помощью лексического приведения является излишним и чрезмерно неэффективным, когда стандартная библиотека C имеет малоизвестную выделенную функцию, которая выполняет эту работу.
Как это работает?
strtol
на первый взгляд кажется довольно сырым, поэтому объяснение сделает код более простым для чтения:
strtol
проанализирует строку, остановившись на первом символе, который нельзя считать частью целого числа. Если вы укажете p
(как я делал выше), он установит p
прямо на этот первый нецелый символ.
Я рассуждаю так: если p
не установлен в конец строки (символ 0), тогда в строке есть нецелый символ s
, означающий, что s
не является правильным целым числом ,
Первые тесты предназначены для устранения угловых случаев (начальные пробелы, пустая строка и т. Д.).
Эта функция, конечно, должна быть настроена в соответствии с вашими потребностями (ли пробелы - ошибка? И т. Д.).
Источники:
См. Описание strtol
по адресу: http://en.cppreference.com/w/cpp/string/byte/strtol.
См. Также описание родственных функций strtol
(strtod
, strtoul
и т. Д.).