Я не могу взять кредит на это решение, хотя оно хорошее, см. этот ТАК.Для тех, кому лень пропустить, автор рекомендует использовать локаль для обработки всех нечисловых цифр как пробела.Это может быть излишним для вашего решения, но идея легко адаптируется.Вместо всего нечислового, вы можете просто использовать «-» в качестве пробела.Вот его код, а не мой.Пожалуйста, если вам это нравится, дайте ему ответ.
struct digits_only: std::ctype<char>
{
digits_only(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table()
{
static std::vector<std::ctype_base::mask>
rc(std::ctype<char>::table_size,std::ctype_base::space);
std::fill(&rc['0'], &rc['9'], std::ctype_base::digit);
return &rc[0];
}
};
bool in_range(int lower, int upper, std::string const &input) {
std::istringstream buffer(input);
buffer.imbue(std::locale(std::locale(), new digits_only()));
int n;
while (buffer>>n)
if (n < lower || upper < n)
return false;
return true;
}
Затем просто удалите пробел и передайте строку atof
.