这是我的代码。我正在创建一个程序,它接受一个字符串输入并将其转换为double。但是,我需要验证输入是否为有效的双精度。那我该怎么办呢?例如,3.14是有效的,但3.1.4,bob123等等无效。
namespace validInput
{
bool IsValidDouble(string inputString)
{
int start = 0; // the index we will start looking for digits
bool valid = true; // assume valid for now
int decCount = 0;
// check for an empty string
if (inputString.length() < 1)
{
valid = false; // no need to check anything else
}
// next, check for a leading sign
else if (inputString.at(0) == '-'|| inputString.at(0) == '+')
{
start = 1; // start checking for digits after the sign
// check that there's at least one character after the sign
if (inputString.length() < 2)
{
valid = false; // no need to check anything else
}
}
// *****************************************
// CHECK FOR ONLY ONE DECIMAL IN INPUT
// *****************************************
return valid; // return true if valid, false if not
}
// Taking string, validating, converting to float(decimal)
double TryDoubleInput()
{
double dNumber;
string inputString;
//cin >> inputString; // accept a string input
getline(cin, inputString);
if (!IsValidDouble(inputString))
{
cerr << "Invalid input. Please enter a number: ";
dNumber = TryDoubleInput();
}
else
{
dNumber = atof(inputString.c_str()); // convert to an integer
}
return dNumber;
}
}
答案 0 :(得分:0)
您可以使用double strtod (const char* str, char** endptr)
成功时,该函数将转换后的浮点数作为double类型的值返回。
如果无法执行有效转换,则函数返回零(0.0)。
如果正确的值超出了类型的可表示值范围,则返回正或负HUGE_VAL,并将errno设置为ERANGE。
答案 1 :(得分:0)
您使用的转换方法是什么?
我宁愿使用转换方法的错误机制,无论这是异常还是返回代码。
N.B。你应该使用inputString.empty()
,它会更快。
答案 2 :(得分:0)
使用strtod
或sscanf("%*lf%n", &n)
,查看输入字符串消耗的字符数。请记住,他们对有效双重表示的想法可能与您的不同。例如,它们允许前导空格和尾随任何内容。如有必要,可能需要进行一些额外的调整,以使您的检查更具限制性。