Не очень C ++ - иш, но что-то вроде этого сделало бы:
#include <cstdlib>
#include <cstring>
bool checkformat(const std::string &s) {
const char *begin = s.c_str();
char *end;
double val = std::strtod(begin, &end);
if (end == begin) return false;
if (*end == '%') ++end;
return (end - begin == s.size());
}
Имейте в виду, что strtod
пропускает начальный пробел, поэтому, если вы не хотите принимать строку с начальным пробеломтогда вам нужно будет отдельно отказаться от этого.Он также принимает "NAN"
, "INF"
, "INFINITY"
(все регистро-независимы), и каждой из этих вещей предшествует +
или -
, а в случае "NAN"
необязательно следует некоторая определенная реализациейсимволы для обозначения , какое значение NaN оно представляет.Возможно, «INF» - это число, но по определению «NAN» - нет, поэтому вы хотите вернуть false, если val != val
, и, возможно, также проверить бесконечность.
[Редактировать: я думаю, что 'Мы исправили проблемы, которые Джеймс поднял ниже, за исключением того, что " "
и " %"
все еще спорны.А потом он добавил переполнение в смесь.Между его ответом и моим вы должны понять - сначала решите, как вы хотите обработать каждый крайний случай, а затем закодируйте его.]