如何检查字符串输入是否为有效的双精度?

时间:2017-03-27 06:04:24

标签: c++ string validation double

这是我的代码。我正在创建一个程序,它接受一个字符串输入并将其转换为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;
}
}

3 个答案:

答案 0 :(得分:0)

您可以使用double strtod (const char* str, char** endptr) 成功时,该函数将转换后的浮点数作为double类型的值返回。 如果无法执行有效转换,则函数返回零(0.0)。 如果正确的值超出了类型的可表示值范围,则返回正或负HUGE_VAL,并将errno设置为ERANGE。

答案 1 :(得分:0)

您使用的转换方法是什么?

我宁愿使用转换方法的错误机制,无论这是异常还是返回代码。

N.B。你应该使用inputString.empty(),它会更快。

答案 2 :(得分:0)

使用strtodsscanf("%*lf%n", &n),查看输入字符串消耗的字符数。请记住,他们对有效双重表示的想法可能与您的不同。例如,它们允许前导空格和尾随任何内容。如有必要,可能需要进行一些额外的调整,以使您的检查更具限制性。