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();
}
यह कैसे काम करता है:
स्ट्रिंगस्ट्रीम >> अधिभार तार को विभिन्न अंकगणितीय प्रकारों में परिवर्तित कर सकता है जो कि वर्णों को क्रम से इस प्रकार से पढ़ता है (इस मामले में ss) जब तक यह पात्रों से बाहर नहीं निकलता है या अगला वर्ण संग्रहीत होने के मापदंड को पूरा नहीं करता है। गंतव्य चर प्रकार में।
उदाहरण 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)
"कचरा" चर व्याख्या ":
क्यों नहीं जाँच करें कि क्या मेरे दोहरे में निष्कर्षण का एक वैध मूल्य है और क्या यह सच है अगर यह करता है?
उपर्युक्त उदाहरण 3 अभी भी सफलतापूर्वक 11 नंबर को my_number वैरिएबल में पढ़ेगा भले ही इनपुट स्ट्रिंग "11ABCD" (जो संख्या नहीं है)।
इस मामले को संभालने के लिए हम एक स्ट्रिंग वेरिएबल (जिसे मैंने कचरा कहा जाता है) में एक और निष्कर्षण कर सकते हैं जो कुछ भी पढ़ सकते हैं जो स्ट्रिंग बफर में टाइप डबल के चर में प्रारंभिक निष्कर्षण के बाद छोड़ दिया गया हो सकता है। यदि कुछ भी छोड़ दिया जाता है, तो इसे "कचरा" में पढ़ा जाएगा, जिसका अर्थ है कि पास किया गया पूर्ण स्ट्रिंग एक संख्या नहीं थी (यह सिर्फ एक के साथ शुरू होता है)। इस मामले में हम झूठे लौटना चाहते हैं;
पूर्वनिर्मित "0" स्पष्टीकरण ":
किसी एकल वर्ण को एक डबल में निकालने का प्रयास विफल हो जाएगा (0 को हमारे डबल में लौटना) लेकिन फिर भी चरित्र के बाद स्ट्रिंग बफर स्थिति को स्थानांतरित करेगा। इस स्थिति में हमारा पढ़ा हुआ कचरा खाली हो जाएगा, जिससे फ़ंक्शन गलत तरीके से सही लौटेगा। इसके आस-पास जाने के लिए मैंने एक 0 को स्ट्रिंग के लिए तैयार किया ताकि यदि उदाहरण में स्ट्रिंग पास हो जाए तो "a" यह "0a" में परिवर्तित हो जाता है जिससे 0 को डबल में निकाला जाएगा और "a" कचरे में निकाला जाएगा।
0 को प्रीपेडिंग करने से संख्या का मान प्रभावित नहीं होगा इसलिए नंबर अभी भी हमारे दोहरे चर में सही तरीके से निकाला जाएगा।
if (expr) return true; return false;
! बस लिखोreturn expr;
।