0

我正在用 Visual C++ 设计一个 gui,并且有一个文本框,用户可以在其中输入值,以便执行计算。如何验证输入以确保它可以转换为双精度值?

4

6 回答 6

3

std::string在任何有一个字段并希望检查它是否包含 a 的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""-13 what?"但接受周围的空白,例如" 3.9E2 ". 如果您想拒绝空格,请尝试#include <iomanip>then 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

您不能将字符串“转换”为双精度,只能其转换。 strtod函数将返回一个指针,该指针指向转换停止的字符串中的字符,因此您可以决定进一步做什么。因此,您可以使用此功能进行转换和检查。

于 2012-05-09T11:42:17.050 回答
2

我推荐Boost 的 lexical_cast,如果转换失败,它会抛出异常。

于 2012-05-09T11:46:33.083 回答
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 回答
1

由于这似乎是一个与 C++ CLI 相关的问题,并且您在文本框中的字符串可能是一个 .NET 字符串,您可能需要检查静态Double::Parse方法。有关更便携的解决方案,请参阅其他答案...

于 2012-05-09T11:53:54.550 回答
0

只需将其转换为双精度值。如果成功,则输入有效。

真的,您不应该编写自己的规则来决定什么是有效的。您永远不会得到与执行实际转换的库函数完全相同的规则。

我最喜欢的方法是使用 sscanf(),并检查返回值以确保恰好转换了一个字段。为了获得额外的积分,请使用 %n 参数来检查是否没有剩余非空白字符。

于 2012-05-09T11:45:06.063 回答