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();
}
come funziona:
il sovraccarico >> sovraccarico può convertire le stringhe in vari tipi aritmetici lo fa leggendo i caratteri in sequenza dal flusso (in questo caso ss) fino a quando non si esauriscono i caratteri O il carattere successivo non soddisfa i criteri per essere memorizzato nel tipo di variabile di destinazione.
Esempio 1:
stringstream ss("11");
double my_number;
ss >> my_number; //my number = 11
example2:
stringstream ss("011");
double my_number;
ss >> my_number; //my number = 11
Example3:
stringstream ss("11ABCD");
double my_number;
ss >> my_number; //my number = 11 (even though there are letters after the 11)
la spiegazione della variabile "immondizia":
perché non solo controllare se l'estrazione nel mio doppio ha un valore valido e quindi restituire true se lo fa?
notare l'esempio 3 sopra leggerà comunque correttamente il numero 11 nella variabile my_number anche se la stringa di input è "11ABCD" (che non è un numero).
per gestire questo caso possiamo fare un'altra estrazione in una variabile stringa (che ho chiamato garbage) che può leggere tutto ciò che potrebbe essere stato lasciato nel buffer delle stringhe dopo l'estrazione iniziale nella variabile di tipo double. Se viene lasciato qualcosa, verrà letto in "immondizia", il che significa che la stringa intera passata non era un numero (inizia solo con uno). in questo caso vorremmo restituire false;
la spiegazione "0" anteposta:
il tentativo di estrarre un singolo carattere in un doppio fallirà (restituendo 0 nel nostro doppio) ma sposta comunque la posizione del buffer di stringa dopo il carattere. In questo caso, la nostra lettura della spazzatura sarà vuota e ciò causerebbe la restituzione errata della funzione true. per ovviare a questo ho anteposto uno 0 alla stringa in modo che se per esempio la stringa passata fosse "a" viene cambiata in "0a" in modo che lo 0 venga estratto nel doppio e "a" venga estratto in garbage.
anteporre uno 0 non influirà sul valore del numero, quindi il numero verrà comunque estratto correttamente nella nostra doppia variabile.
if (expr) return true; return false;
! Basta scriverereturn expr;
.