bool isNumeric(string s){
if ( !s.empty() && s[0] != '-' )
s = "0" + s;
string garbage;
stringstream ss(s);
ss >> *(auto_ptr<double>(new double)) >> garbage;
return garbage.empty();
}
jak to działa:
stringstream >> overload może konwertować łańcuchy do różnych typów arytmetycznych, robi to poprzez sekwencyjne odczytywanie znaków ze strumienia (w tym przypadku ss), dopóki nie zabraknie znaków LUB następny znak nie spełnia kryteriów do zapisania do typu zmiennej docelowej.
Przykład 1:
stringstream ss("11");
double my_number;
ss >> my_number;
przykład2:
stringstream ss("011");
double my_number;
ss >> my_number;
przykład3:
stringstream ss("11ABCD");
double my_number;
ss >> my_number;
objaśnienie zmiennej „śmieci”:
dlaczego nie po prostu sprawdzić, czy wyodrębnienie do mojego double ma prawidłową wartość, a następnie zwrócić true, jeśli tak?
Zauważ, że przykład3 powyżej nadal pomyślnie odczyta liczbę 11 do zmiennej my_number, nawet jeśli ciąg wejściowy to „11ABCD” (który nie jest liczbą).
aby obsłużyć ten przypadek, możemy wykonać kolejne wyodrębnienie do zmiennej łańcuchowej (którą nazwałem śmieci), która może odczytać wszystko, co mogło zostać w buforze ciągów po początkowym wyodrębnieniu do zmiennej typu double. Jeśli cokolwiek zostanie, zostanie wczytane do „śmieci”, co oznacza, że cały przekazany ciąg nie był liczbą (po prostu zaczyna się od jedynki). w takim przypadku chcielibyśmy zwrócić fałsz;
dołączone „0” wyjaśnienie ”:
próba wyodrębnienia pojedynczego znaku do znaku podwójnego zakończy się niepowodzeniem (zwrócenie 0 do naszego znaku podwójnego), ale nadal spowoduje przesunięcie pozycji bufora ciągu na koniec znaku. W takim przypadku nasz odczyt śmieci będzie pusty, co spowoduje, że funkcja niepoprawnie zwróci wartość true. aby obejść ten problem, dodałem 0 do łańcucha, więc jeśli na przykład przekazany ciąg był „a”, zostanie zmieniony na „0a”, tak że 0 zostanie wyodrębnione do podwójnego, a „a” zostanie wyodrębnione do śmieci.
dodanie 0 nie wpłynie na wartość liczby, więc liczba będzie nadal poprawnie wyodrębniona do naszej podwójnej zmiennej.
if (expr) return true; return false;
! Po prostu napiszreturn expr;
.