C/C++

Определение числа в строке int или float

Дано число, записанное в sting, как определить там число int или float и перевести его в нужную переменную.
Veterok 99
Veterok 99
767
#include <iostream>
#include <string>
using namespace std;
bool is_float(const string& s) {
return s.find('.') != string::npos;
}
int main() {
string sf = "125.36";
string si = "12536";
if (is_float(sf)) {
float x = stof(sf);
cout << x << " => float\n";
} else {
int x = stoi(sf);
cout << x << " => int\n";
}
if (is_float(si)) {
float x = stof(si);
cout << x << " => float\n";
} else {
int x = stoi(si);
cout << x << " => int\n";
}
system("pause > nul");
}
maax777
maax777
80 664
Лучший ответ
Олег Спиридонов Сразу я не автор вопроса и в целом рабочее решение, но если мы введем в строку нецифровой символ, то что? Ошибка.
То есть до этого надо еще убедиться что кроме минуса в первой позиции, цифр и разделителя "," или "." в строке ничего нет. Поэтому лично я бы предпочел решение через регулярные выражения.
Олег Спиридонов можно конечно через try мучать комп попытками преобразования, но это на крайний случай, ибо медленно.
сначала попробовать распарсить как int (std::stoi), если не получится - std::stof и парсим как float
вообще есть такая штука, как регулярные выражения https://docs.microsoft.com/ru-ru/cpp/standard-library/regular-expressions-cpp?view=msvc-160 (хотя там описание не самое понятное, но найти материалы не сложно, если знать, что ищете), с помощью которых можно задать маску и проверить строку на соответствие этой маске и действовать в соответствии с ней
например регуляркt "^[-]?\d*$" будет соответствовать строка, в начале "^" которой может быть ровно 1 знак минус, или он может отсутствовать "[-]?", а после него идет от 1до сколько влезет цифр "\d*" до конца строки "$". Очевидно это подходит для целых чисел, аналогично можно составить маски для float "^[-]?\d*[.,]\d*$". то есть может начинаться с минуса или цифры, затем идет ровно одна точка или запятая а после нее до конца строки только цифры.
Есть конечно вопрос с экспоненциальной формой записи.
пробелы из строки нужно предварительно удалить, все. мало ли как там 1 число записали, может разделив разряды, для удобства ввода.
С 11 версии std::stoi для инт и std::stof для дабл