Могу ли я сказать, представляет ли std::string число с помощью stringstream?
по-видимому, это должно работать, показывая, является ли строка числовой, например "12.5" = = yes," abc " = = no. Однако я не получаю никакого reguardless ввода.
std::stringstream ss("2");
double d; ss >> d;
if(ss.good()) {std::cout<<"number"<<std::endl;}
else {std::cout<<"other"<<std::endl;}
4 ответов
вы должны использовать istringstream
чтобы он знал, что пытается проанализировать ввод. Кроме того, просто проверьте результат извлечения непосредственно, а не с помощью good
позже.
#include <sstream>
#include <iostream>
int main()
{
std::istringstream ss("2");
double d = 0.0;
if(ss >> d) {std::cout<<"number"<<std::endl;}
else {std::cout<<"other"<<std::endl;}
}
не используйте good ()! Проверьте, является ли поток не удалось или нет:
if (ss)
Good сообщает вам, установлен ли какой-либо из eofbit, badbit или failbit, а fail() сообщает вам о badbit и failbit. Вы почти никогда не заботитесь о eofbit, если вы уже знайте, что поток не удался, поэтому вы почти никогда не хотите использовать хорошо.
обратите внимание, что тестирование потока напрямую, как указано выше, в точности соответствует:
if (!ss.fail())
наоборот !ss эквивалент ss.неудача.)(
объединение извлечения в условное выражение:
if (ss >> d) {/*...*/}
в точности соответствует:
ss >> d;
if (ss) {/*...*/}
однако вы, вероятно, хотите проверить, может ли полная строка быть преобразована в double, что немного сложнее. Использовать boost::lexical_cast, который уже обрабатывает все случаи.
если вы хотите проверить, является ли string
содержит только число и ничего больше (кроме пробелов), используйте это:
#include <sstream>
bool is_numeric (const std::string& str) {
std::istringstream ss(str);
double dbl;
ss >> dbl; // try to read the number
ss >> std::ws; // eat whitespace after number
if (!ss.fail() && ss.eof()) {
return true; // is-a-number
} else {
return false; // not-a-number
}
}
The ss >> std::ws
важно для приема чисел с конечными пробелами, такими как "24 "
.
The ss.eof()
проверка важна для отклонения строк, таких как "24 abc"
. Это гарантирует, что мы достигли конца строки после чтения числа (и пробелов).
int str2int (const string &str) {
stringstream ss(str);
int num;
if((ss >> num).fail())
{
//ERROR: not a number
}
return num;
}