[英]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.