bool isNumeric(string s){
if ( !s.empty() && s[0] != '-' )
s = "0" + s; //prepend 0
string garbage;
stringstream ss(s);
ss >> *(auto_ptr<double>(new double)) >> garbage;
/*
//the line above extracts the number into an anonymous variable. it could also be done like this:
double x;
ss >> x >> garbage;
*/
//if there is no garbage return true or else return false
return garbage.empty();
}
So funktioniert es:
Die Überladung von stringstream >> kann Zeichenfolgen in verschiedene arithmetische Typen konvertieren. Dazu werden Zeichen nacheinander aus dem Zeichenfolgenstrom (in diesem Fall ss) gelesen, bis die Zeichen ausgehen oder das nächste Zeichen die zu speichernden Kriterien nicht erfüllt in den Zielvariablentyp.
Beispiel 1:
stringstream ss("11");
double my_number;
ss >> my_number; //my number = 11
Beispiel 2:
stringstream ss("011");
double my_number;
ss >> my_number; //my number = 11
Beispiel 3:
stringstream ss("11ABCD");
double my_number;
ss >> my_number; //my number = 11 (even though there are letters after the 11)
die "Müll" -Variablenerklärung ":
Warum nicht einfach prüfen, ob die Extraktion in mein Double einen gültigen Wert hat, und dann true zurückgeben, wenn dies der Fall ist?
Beachten Sie, dass Beispiel 3 oben die Nummer 11 weiterhin erfolgreich in die Variable my_number einliest, selbst wenn die Eingabezeichenfolge "11ABCD" ist (was keine Nummer ist).
Um diesen Fall zu behandeln, können wir eine weitere Extraktion in eine Zeichenfolgenvariable (die ich Garbage nannte) durchführen, die alles lesen kann, was nach der anfänglichen Extraktion in die Variable vom Typ double im Zeichenfolgenpuffer übrig geblieben ist. Wenn noch etwas übrig ist, wird es in "Garbage" eingelesen, was bedeutet, dass die übergebene vollständige Zeichenfolge keine Zahl war (sie beginnt nur mit einer). In diesem Fall möchten wir false zurückgeben.
die vorangestellte "0" Erklärung ":
Der Versuch, ein einzelnes Zeichen in ein Double zu extrahieren, schlägt fehl (0 in unser Double zurück), verschiebt jedoch die Position des Zeichenfolgenpuffers nach dem Zeichen. In diesem Fall ist unser Garbage Read leer, was dazu führen würde, dass die Funktion fälschlicherweise true zurückgibt. Um dies zu umgehen, habe ich der Zeichenfolge eine 0 vorangestellt, sodass, wenn beispielsweise die übergebene Zeichenfolge "a" war, diese in "0a" geändert wird, sodass die 0 in das Double und "a" in den Müll extrahiert wird.
Das Voranstellen einer 0 hat keinen Einfluss auf den Wert der Zahl, sodass die Zahl weiterhin korrekt in unsere Doppelvariable extrahiert wird.
if (expr) return true; return false;
! Schreib einfachreturn expr;
.