2017-03-27 20 views
1

ここに私のコードです。私は文字列入力を受け取り、それを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; 
} 
} 

答えて

0

あなたは成功したdouble strtod (const char* str, char** endptr) を使用することができ、この関数はdouble型の値として変換浮動小数点数を返します。 有効な変換が実行できない場合、関数はゼロ(0.0)を返します。 正しい値が型の表現可能な値の範囲外の場合は、正または負のHUGE_VALが返され、errnoはERANGEに設定されます。

0

どのような変換方法を使用していますか?

これは例外であるかリターンコードであるかに関わらず、私はむしろ変換メソッドのエラーメカニズムを使用します。

N.B. inputString.empty()を使用する必要があります。

+0

成功/エラーがあれば何が起こっているかを示すコードを更新しました – Avoxy

0

strtodまたはsscanf("%*lf%n", &n)を使用して、入力文字列から消費した文字の数を確認してください。有効な二重表現の考え方は、あなたと違うかもしれません。たとえば、先頭に空白があり、何かを末尾に置くことができます。必要に応じて、より厳しいチェックを行うために、いくつかの追加調整が必要な場合があります。

関連する問題