別のバージョン...
を使用strtol
し、単純な関数内にラップして複雑さを隠します。
inline bool isInteger(const std::string & s)
{
if(s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false;
char * p;
strtol(s.c_str(), &p, 10);
return (*p == 0);
}
なぜstrtol
ですか?
私が C++ を愛している限り、私に関する限り、C API が最良の答えである場合があります。
- 例外を使用することは、失敗することが許可されているテストにとってやり過ぎです
- レキシカル キャストによる一時的なストリーム オブジェクトの作成は、C 標準ライブラリにジョブを実行するほとんど知られていない専用関数がある場合、やり過ぎで非効率的です。
それはどのように機能しますか?
strtol
一見すると非常に生のように見えるので、説明によりコードが読みやすくなります。
strtol
文字列を解析し、整数の一部と見なすことができない最初の文字で停止します。あなたが提供した場合p
(私が上で行ったように)、p
この最初の非整数文字で正しく設定されます。
私の推論は、p
が文字列の末尾 (文字 0) に設定されていない場合、文字列に整数以外の文字が含まれているためです。s
つまりs
、 は正しい整数ではありません。
最初のテストは、コーナー ケース (先頭のスペース、空の文字列など) を排除するためにあります。
もちろん、この関数はニーズに合わせてカスタマイズする必要があります (先頭のスペースはエラーですか? など)。
ソース:
http://en.cppreference.com/w/cpp/string/byte/strtolの説明を参照してstrtol
ください。
strtol
の姉妹関数 ( strtod
、strtoul
など)の説明も参照してください。