0

Visual C++ で GUI を設計しています。計算を実行できるようにユーザーが値を入力するテキスト ボックスがあります。入力を検証してdouble値にキャストできることを確認するにはどうすればよいですか?

4

6 に答える 6

3

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)
于 2012-05-09T11:46:07.667 に答える
2

Boost の lexical_castをお勧めします。これは、変換が失敗した場合に例外をスローします。

于 2012-05-09T11:46:33.083 に答える
2

文字列を double に「キャスト」することはできません。変換のみが可能です。 strtod関数は、変換が停止した文字列内の文字へのポインターを返すため、さらに何をすべきかを決めることができます。したがって、この関数を変換 AND チェックに使用できます。

于 2012-05-09T11:42:17.050 に答える
1

これはC++CLI関連の質問のようであり、テキストボックスからの文字列は.NET文字列である可能性があるため、静的なDouble::Parseメソッドを確認することをお勧めします。よりポータブルなソリューションについては、他の回答を参照してください...

于 2012-05-09T11:53:54.550 に答える
1

すでに述べたように、 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);
}
于 2012-05-09T11:49:27.527 に答える
0

double 値に変換するだけです。成功した場合、入力は有効です。

実際、何が有効かを判断する独自のルールを作成するべきではありません。実際の変換を行うライブラリ関数とまったく同じルールを得ることは決してありません。

私のお気に入りのレシピは、sscanf() を使用し、戻り値をチェックして、1 つのフィールドだけが変換されたことを確認することです。追加のクレジットとして、%n パラメータを使用して、空白以外の文字が残っていないことを確認してください。

于 2012-05-09T11:45:06.063 に答える