Могу ли я сказать, представляет ли 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;
}