Kann ich feststellen, ob eine std :: string eine Zahl mit stringstream darstellt?

8

Anscheinend soll dies funktionieren um zu zeigen, ob eine Zeichenkette numerisch ist, zum Beispiel "12.5" == ja, "abc" == nein. Allerdings bekomme ich keinen Hinweis auf die Eingabe.

%Vor%     
alan2here 07.02.2011, 00:38
quelle

4 Antworten

4

Sie sollten istringstream verwenden, damit es weiß, dass es versucht, Eingaben zu analysieren. Überprüfen Sie auch das Ergebnis der Extraktion direkt, anstatt good später zu verwenden.

%Vor%     
Mark B 07.02.2011, 00:49
quelle
7

Benutze kein gutes ()! Testen Sie, ob der Stream fehlgeschlagen ist oder nicht :

%Vor%

Good sagt Ihnen, ob eofbit, badbit oder failbit gesetzt sind, während fail () Sie über badbit und failbit informiert. Sie interessieren sich fast nie für eofbit, es sei denn, Sie schon wissen, dass der Stream fehlgeschlagen ist, so dass Sie fast nie gut verwenden möchten.

Beachten Sie, dass das Testen des Streams direkt wie oben genau entspricht:

%Vor%

Umgekehrt ist! ss äquivalent zu ss.fail ().

Kombinieren der Extraktion in den bedingten Ausdruck:

%Vor%

Entspricht genau:

%Vor%

Wahrscheinlich möchten Sie jedoch testen, ob die komplette Zeichenfolge in ein Double konvertiert werden kann, was ein wenig komplizierter ist. Verwenden Sie boost :: lexical_cast, das bereits alle Fälle behandelt.

    
Fred Nurk 07.02.2011 00:50
quelle
5

Wenn Sie überprüfen möchten, ob eine string nur eine Zahl und nichts anderes (außer Leerzeichen) enthält, verwenden Sie Folgendes:

%Vor%

ss >> std::ws ist wichtig für die Annahme von Zahlen mit nachgestellten Leerzeichen wie "24 " .

Die Überprüfung ss.eof() ist wichtig, um Zeichenfolgen wie "24 abc" zurückzuweisen. Es stellt sicher, dass wir das Ende der Zeichenfolge nach dem Lesen der Zahl (und Leerzeichen) erreicht haben.

Testkabel:

%Vor%

Ausgabe:

%Vor%     
QuasarDonkey 15.02.2013 17:30
quelle
-1
%Vor%     
Julio Gorgé 07.02.2011 00:56
quelle

Tags und Links