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();
}
使い方:
stringstream >>オーバーロードは、文字列をさまざまな算術型に変換できます。これは、文字列(この場合はss)から文字がなくなるまで、または次の文字が格納される基準を満たさなくなるまで文字を順次読み取ることによって行われます。宛先変数タイプに。
例1:
stringstream ss("11");
double my_number;
ss >> my_number; //my number = 11
例2:
stringstream ss("011");
double my_number;
ss >> my_number; //my number = 11
例3:
stringstream ss("11ABCD");
double my_number;
ss >> my_number; //my number = 11 (even though there are letters after the 11)
「ガベージ」変数の説明」:
私のdoubleへの抽出に有効な値があるかどうかを確認し、有効な場合はtrueを返すのはなぜですか?
上記のexample3は、入力文字列が "11ABCD"(数値ではない)の場合でも、数値11をmy_number変数に正常に読み取ることに注意してください。
このケースを処理するために、文字列変数(私はgarbageと名付けました)への別の抽出を行うことができます。何かが残っている場合は、「ガベージ」に読み込まれます。これは、渡された文字列全体が数値ではなかったことを意味します(1で始まるだけです)。この場合、falseを返します。
先頭に「0の説明」:
単一の文字をdoubleに抽出しようとすると失敗します(doubleに0が返されます)が、文字列バッファの位置は文字の後に移動します。この場合、ガベージリードは空になるため、関数は誤ってtrueを返します。これを回避するために、文字列の先頭に0を追加しました。たとえば、渡された文字列が「a」の場合、「0a」に変更されて、0がdoubleに抽出され、「a」がゴミに抽出されます。
先頭に0を付けても数値の値には影響しないため、数値は引き続きdouble変数に正しく抽出されます。
if (expr) return true; return false;
!書くだけreturn expr;
。