an が数値かどうかを確認する必要がありstd::string
ます。数値とは、整数または小数点付きの数値 (基数 10) のいずれかを意味します。
私はlong long
気にしない外部のものを提供する制限に問題はありません。ブーストはありませんが、コピーしましたlexical_cast
。
文字列が実際に機能することを確認するためにキャストするようdouble
ですが、私が考えていないコーナーケースがあるかどうか疑問に思っています。
#include <typeinfo>
#include <sstream>
template<typename Out, typename In> static Out lexical_cast(In input)
{
stringstream ss;
ss << input;
Out r;
if ((ss >> r).fail() || !(ss >> std::ws).eof())
{
throw std::bad_cast();
}
return r;
}
bool is_numeric(const string in)
{
bool success = false;
try
{
lexical_cast<double>(in);
success = true;
}
catch(std::bad_cast &exc)
{
success = false;
}
return success;
}
編集
浮動小数点数
私は C++0x/C++11 を使用していないため、正規表現を使用して浮動小数点数を簡単に検証することはできません。そして、文字列を自分で解析する必要がないようにしようとしています。これは、何も欠落していないことを確認するために、さらに単体テストを行う必要があることを意味します。
NaN を使用すると、プロパティfloat1 != float1
があることはわかっていますが、GCC はこれを台無しにします。