繁体   English   中英

在Visual C ++中进行双重测试

[英]testing for double in visual c++

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

在任何具有std::string字段并希望检查它是否包含double C ++环境中,您都可以简单地执行以下操作:

#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>然后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)

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

我建议使用Boost的lexical_cast ,如果转换失败,它将抛出异常。

如前所述,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);
}

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

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

确实,您不应该编写自己的规则来确定有效内容。 您将永远不会获得与库函数完全相同的规则来进行实际的转换。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM