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();
}
nasıl çalışır:
dizi akımı >> aşırı yüklemesi dizgeleri çeşitli aritmetik türlere dönüştürebilir, bunu karakter bitene kadar dizge akışından (bu durumda ss) karakterleri sırayla okuyarak yapar VEYA sonraki karakter depolanacak kriterleri karşılamaz hedef değişken türüne.
örnek 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)
"çöp" değişken açıklaması ":
neden sadece çiftime ayıklamanın geçerli bir değere sahip olup olmadığını kontrol etmiyor ve varsa doğruya dönmüyor?
Yukarıdaki uyarı example3, girdi dizesi "11ABCD" (bu bir sayı değil) olsa bile, 11 sayısını my_number değişkenine başarılı bir şekilde okuyacaktır.
Bu durumu ele almak için, double türündeki değişkene ilk ayıklamadan sonra dize tamponunda kalan her şeyi okuyabilen bir dize değişkenine (ben çöp olarak adlandırdığım) başka bir çıkarma yapabiliriz. Geriye kalan herhangi bir şey varsa "çöp" olarak okunacaktır, bu da aktarılan tüm dizenin bir sayı olmadığı anlamına gelir (sadece bir ile başlar). bu durumda yanlış döndürmek isteriz;
başına eklenen "0" açıklaması ":
tek bir karakteri bir ikiliye çıkarmaya çalışmak başarısız olur (çiftimize 0 döndürür) ama yine de dizge tampon konumunu karakterin arkasına taşır. Bu durumda, çöp okumamız boş olacak ve bu da işlevin yanlış bir şekilde doğruya dönmesine neden olacaktır. bunun üstesinden gelmek için dizenin başına 0 ekledim, böylece örneğin iletilen dizi "a" ise "0a" olarak değiştirilir, böylece 0 ikiye çıkarılır ve "a" çöpe çıkarılır.
Bir 0'ın başına eklenmesi sayının değerini etkilemeyecektir, bu nedenle sayı yine de çift değişkenimize doğru bir şekilde çıkarılacaktır.
if (expr) return true; return false;
! Sadece yazınreturn expr;
.