我正在用 Visual C++ 设计一个 gui,并且有一个文本框,用户可以在其中输入值,以便执行计算。如何验证输入以确保它可以转换为双精度值?
6 回答
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)
您不能将字符串“转换”为双精度,只能将其转换。 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 参数来检查是否没有剩余非空白字符。