2011-02-07 6 views
8

文字列が数字の場合、例えば "12.5" == yes、 "abc" == noと表示されているように見えます。しかし、私は入力の無条件に取得します。std :: stringがstringstreamを使用して数値を表すかどうかを確認できますか?

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 abc"は数字ではありません。たとえば、空白が埋め込まれた文字列です。IIRCの解決策は、{{ss.peek()== EOF}}(すべてが消費された)か、{{ss.gcount()}}を調べることです。 – Tom

7

good()!を使用しないでください。テストストリームがfailed or notされている場合:

if (ss) 

グッド()が失敗しながらeofbit、badbitを、またはfailbitのいずれかが、設定されている場合を示しますbadbitをし、failbitについて説明します。 が既にでストリームが失敗していることが分かっていない限り、ほとんどの場合、eofbitは気にしません。 !の直接ストリームをテスト

注、上記のように正確に等しい:

if (!ss.fail()) 

逆に、SSはss.failと等価です()。条件式に抽出を組み合わせる


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

しかし、あなたはおそらく完全な文字列ができた場合にテストしたい:

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

はとまったく同じですダブルに変換され、これはもう少し複雑です。 boost :: 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 
関連する問題