2011-02-07 10 views
8

स्पष्ट रूप से यह दिखाता है कि स्ट्रिंग संख्यात्मक है, उदाहरण के लिए "12.5" == हाँ, "abc" == no। हालांकि मुझे इनपुट का कोई नियम नहीं है।क्या मैं बता सकता हूं कि std :: स्ट्रिंग स्ट्रिंगस्ट्रीम का उपयोग करके किसी संख्या का प्रतिनिधित्व करती है?

std::stringstream ss("2"); 
double d; ss >> d; 
if(ss.good()) {std::cout<<"number"<<std::endl;} 
else {std::cout<<"other"<<std::endl;} 
+2

"12.5 abc" के रूप में "एक स्ट्रिंग संख्यात्मक कि" माना जाएगा? यदि "नहीं", अब तक कोई भी उत्तर लागू नहीं होता है। – etarion

उत्तर

4

आप इतना है कि यह जानता है कि यह इनपुट पार्स करने के लिए कोशिश कर रहा है एक istringstream उपयोग करना चाहिए। साथ ही, बाद में good का उपयोग करने के बजाय निष्कर्षण के परिणाम की जांच करें।

#include <sstream> 
#include <iostream> 

int main() 
{ 
    std::istringstream ss("2"); 
    double d = 0.0; 
    if(ss >> d) {std::cout<<"number"<<std::endl;} 
    else {std::cout<<"other"<<std::endl;} 
} 
+0

"यह जानता है कि यह इनपुट विश्लेषण करने की कोशिश कर रहा है" बिल्कुल कैसे? कोड स्पष्टता के लिए शायद अच्छा है, लेकिन मुझे कोई तकनीकी कारण नहीं दिख रहा है। –

+1

आप अतिरिक्त सामग्री की जांच नहीं कर रहे हैं। "2 एबीसी" एक संख्या नहीं है, उदाहरण के लिए - यह एम्बेडेड व्हाइटस्पेस वाला एक स्ट्रिंग है।आईआईआरसी, समाधान {{ss.peek() == EOF}} (सब कुछ खपत किया गया था) की जांच करना है या शायद {{ss.gcount()}} देखकर। – Tom

7

अच्छा() का उपयोग न करें! टेस्ट करता है, तो धारा failed or not है:

if (ss) 

अच्छा आपको बताता है eofbit, badbit, या failbit के किसी भी, सेट कर रहे हैं अगर, जबकि असफल() badbit और failbit बारे में बताता है। जब तक आप पहले से ही जानते हैं कि स्ट्रीम विफल हो गई है, तो आप लगभग कभी भी ईफिट की परवाह नहीं करते हैं, इसलिए आप लगभग कभी भी अच्छा उपयोग नहीं करना चाहते हैं। ! कि धारा सीधे परीक्षण

ध्यान दें, जैसा कि ऊपर, बिल्कुल के बराबर है:

if (!ss.fail()) 

इसके विपरीत, एस एस ss.fail के बराबर है()।


सशर्त अभिव्यक्ति में निकासी का मेल:

ss >> d; 
if (ss) {/*...*/} 

हालांकि, आप शायद पूरा स्ट्रिंग हो सकती है यदि परीक्षण करना चाहते हैं:

if (ss >> d) {/*...*/} 

बिल्कुल बराबर है एक डबल में परिवर्तित, जो थोड़ा और अधिक शामिल है। बूस्ट :: lexical_cast का प्रयोग करें जो पहले से ही सभी मामलों को संभालता है।

-1
int str2int (const string &str) { 
    stringstream ss(str); 
    int num; 
    if((ss >> num).fail()) 
    { 
     //ERROR: not a number 
    } 
    return num; 
} 
5

आप की जाँच करने के लिए कि क्या एक stringकेवल एक नंबर और (सफेद स्थान को छोड़कर) और कुछ नहीं होता है चाहते हैं, इस का उपयोग करें:

#include <sstream> 

bool is_numeric (const std::string& str) { 
    std::istringstream ss(str); 
    double dbl; 
    ss >> dbl;  // try to read the number 
    ss >> std::ws; // eat whitespace after number 

    if (!ss.fail() && ss.eof()) { 
     return true; // is-a-number 
    } else { 
     return false; // not-a-number 
    } 
} 

ss >> std::ws खाली स्थान के ऐसे पूर्ण विराम वाले नंबरों को स्वीकार करने के लिए महत्वपूर्ण है "24 " के रूप में।

ss.eof()"24 abc" जैसे स्ट्रिंग को अस्वीकार करने के लिए चेक महत्वपूर्ण है। यह सुनिश्चित करता है कि हम संख्या (और सफेद जगह) पढ़ने के बाद स्ट्रिंग के अंत तक पहुंच गए।

टेस्ट दोहन:

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    std::string tests[8] = { 
      "", "XYZ", "a26", "3.3a", "42 a", "764", " 132.0", "930 " 
    }; 
    std::string is_a[2] = { "not a number", "is a number" }; 
    for (size_t i = 0; i < sizeof(tests)/sizeof(std::string); ++i) { 
     std::cout << std::setw(8) << "'" + tests[i] + "'" << ": "; 
     std::cout << is_a [is_numeric (tests[i])] << std::endl; 
    } 
} 

आउटपुट:

 '': not a number 
    'XYZ': not a number 
    'a26': not a number 
    '3.3a': not a number 
    '42 a': not a number 
    '764': is a number 
' 132.0': is a number 
    '930 ': is a number 
संबंधित मुद्दे

 संबंधित मुद्दे