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();
}
cara kerjanya:
stringstream >> overload dapat mengonversi string ke berbagai tipe aritmatika yang dilakukannya dengan membaca karakter secara berurutan dari stringstream (ss dalam kasus ini) hingga kehabisan karakter ATAU karakter berikutnya tidak memenuhi kriteria untuk disimpan ke dalam tipe variabel tujuan.
Contoh 1:
stringstream ss("11");
double my_number;
ss >> my_number; //my number = 11
contoh2:
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)
penjelasan variabel "sampah":
mengapa tidak mengecek apakah ekstraksi ke dalam double saya memiliki nilai yang valid dan kemudian mengembalikan true jika benar?
perhatikan example3 di atas masih akan berhasil membaca angka 11 ke dalam variabel my_number bahkan jika string input adalah "11ABCD" (yang bukan angka).
untuk menangani kasus ini kita dapat melakukan ekstraksi lain ke dalam variabel string (yang saya namakan sampah) yang dapat membaca apa pun yang mungkin telah tersisa di buffer string setelah ekstraksi awal ke dalam variabel tipe ganda. Jika ada sesuatu yang tersisa itu akan dibaca menjadi "sampah" yang berarti string penuh yang dilewati bukanlah angka (itu hanya dimulai dengan satu). dalam hal ini kami ingin mengembalikan false;
penjelasan "0" yang disebutkan sebelumnya:
mencoba mengekstraksi karakter tunggal menjadi ganda akan gagal (mengembalikan 0 ke dalam ganda kami) tetapi masih akan memindahkan posisi buffer string ke setelah karakter. Dalam hal ini pembacaan sampah kami akan kosong yang akan menyebabkan fungsi salah mengembalikan benar. untuk menyiasatinya, saya menambahkan 0 ke string sehingga jika misalnya string yang dilewatkan adalah "a" maka akan diubah menjadi "0a" sehingga 0 akan diekstraksi menjadi dobel dan "a" diekstraksi menjadi sampah.
mengawali a 0 tidak akan memengaruhi nilai angka sehingga angka tersebut masih akan diekstraksi dengan benar ke dalam variabel ganda kami.
if (expr) return true; return false;
! Cukup tulisreturn expr;
.