Visual C++ で GUI を設計しています。計算を実行できるようにユーザーが値を入力するテキスト ボックスがあります。入力を検証してdouble値にキャストできることを確認するにはどうすればよいですか?
6 に答える
std::string
フィールドがあり、フィールドに が含まれているかどうかを確認したいC++ 環境では、次のdouble
ように簡単に実行できます。
#include <sstream>
std::istringstream iss(string_value);
double double_value;
char trailing_junk;
if (iss >> double_value && !(iss >> trailing_junk))
{
// can use the double...
}
提示されているように、これは"1.234q"
orのようなものを拒否します"-13 what?"
が、周囲の空白を受け入れます" 3.9E2 "
。空白を拒否したい場合は、 を試して#include <iomanip>
くださいif (iss >> std::noskipws >> double_value && iss.peek() == EOF) ...
。
古いスタイルの C API を使用してこれを行うこともできます。
double double_value;
if (sscanf(string_value.c_str(), "%lf%*c", &double_value) == 1)
Boost の lexical_castをお勧めします。これは、変換が失敗した場合に例外をスローします。
文字列を double に「キャスト」することはできません。変換のみが可能です。 strtod関数は、変換が停止した文字列内の文字へのポインターを返すため、さらに何をすべきかを決めることができます。したがって、この関数を変換 AND チェックに使用できます。
これはC++CLI関連の質問のようであり、テキストボックスからの文字列は.NET文字列である可能性があるため、静的なDouble::Parseメソッドを確認することをお勧めします。よりポータブルなソリューションについては、他の回答を参照してください...
すでに述べたように、 strtod(3) が答えです。
bool is_double(const char* str) {
char *end = 0;
strtod(str, &end);
// Is the end point of the double the end of string?
return end == str + strlen(str);
}
@Ian Goldby の懸念に対処するために、文字列の最後の空白が懸念される場合は、次のようにします。
bool is_double(const char* str) {
char *end = 0;
strtod(str, &end);
// Is the end point of the double plus white space the end of string?
return end + strspn(end, " \t\n\r") == str + strlen(str);
}
double 値に変換するだけです。成功した場合、入力は有効です。
実際、何が有効かを判断する独自のルールを作成するべきではありません。実際の変換を行うライブラリ関数とまったく同じルールを得ることは決してありません。
私のお気に入りのレシピは、sscanf() を使用し、戻り値をチェックして、1 つのフィールドだけが変換されたことを確認することです。追加のクレジットとして、%n パラメータを使用して、空白以外の文字が残っていないことを確認してください。