2017-05-02 7 views
-1

私は次の方法をとっており、入力部分を検証部分から分離したい、つまりある方法(ReadInput)で入力を読み込み、入力値が別の方法(AssertIsDouble)のdoubleの型であることをアサーションしたい。 。どうやってやるの?入力を2つの別々のメソッドに分割する方法は?

public static double ReadInput() 
{ 
    double number = 0; 

    while (true) 
    { 

     if (Double.TryParse(Console.ReadLine(), out number) && number > 0) 
     { 
      return number; 
     } 
     else 
     { 
      Console.WriteLine("Please, input a number greater than zero (0)."); 
     } 
    } 
} 

私は次のことを試してみましたが、それはうまくいきませんでした:

public static double ReadInput() 
{ 
    double number = 0; 

    while (true) 
    { 
     AssertIsDouble(Console.ReadLine()); 
    } 
} 

private static double AssertIsDouble(string input) 
{ 
    double number = 0.0; 

    if (Double.TryParse(input, out number) && number > 0) 
    { 
     return number; 
    } 
    else 
    { 
     Console.WriteLine("Please, input a number greater than zero (0)."); 
    } 
} 
+0

@Valentinいいえプログラムフローを制御するために例外を使用したくないです。 – TheLethalCoder

+0

あなたはどこで番号を返すのですか? –

+2

あなたは無限のループを持っています... – Orangesandlemons

答えて

1

私はAssertメソッドからboolを返すとともにoutパラメータを使用すると思います。

免責事項:コードはテストされていませんが、動作するはずです。

public static double ReadInput() 
{ 
    double number; 

    while (!AssertIsDouble(Console.ReadLine(), out number)) 
    { 
     Console.WriteLine("Please, input a number greater than zero (0)."); 
    } 

    return number; 
} 

public bool AssertIsDouble(string input, out double number) 
{ 
    return (Double.TryParse(input, out number) && number > 0); 
} 

私があなただった場合、彼らは少し不明であるとして、私はまた、現時点ではメソッドの名前を変更したいことを注意:

  • ReadInput:何を入力、何として読みますか?
  • AssertIsDouble:悪い名前ではありませんが、追加のチェックも行います。また

このループは、あなたのオリジナルのコードに問題があることを注意してください。したがって、

while (true) 
{ 
    AssertIsDouble(Console.ReadLine()); 
} 

あなたがメソッド呼び出しからの戻り値を代入/チェック決して、ループから抜け出すための条件を設定することはありません無限ループがあります。

1

ユーザーから強く型付けされた(文字列以外の)入力を取得するために私がよく行うことは、ユーザーに表示するかどうかを尋ねる別の方法、誤った値を入力する場合のエラーのプロンプト、入力に対して許容される最小値/最大値。これは、大幅にメインコード本体を簡素化:

private static double GetDoubleFromUser(
    string prompt = "Please enter a number: ", 
    string errorPrompt = " - Error: input must be a number between {0} and {1}: ", 
    double minValue = double.MinValue, double maxValue = double.MaxValue) 
{ 
    double value; 

    // Write the prompt text and get input from user 
    if (prompt != null) Console.Write(prompt, minValue, maxValue); 

    while (!double.TryParse(Console.ReadLine(), out value) 
      || value < minValue || value > maxValue) 
    { 
     // If input can't be converted to a double or is out of range, keep trying 
     if (errorPrompt != null) Console.Write(errorPrompt, minValue, maxValue); 
    } 

    // Return converted input value 
    return value; 
} 

、コードのあなたの本体に、あなたのようなものばかりだろう。

double input = GetDoubleFromUser("Please input the amount: ", 
    "- input must be a number greater than zero: ", 0); 

Console.WriteLine($"You entered: {input}"); 

を、メソッドが残りを処理します。

enter image description here

+0

私はメソッドが好きですが、ユーザが入力されていない場合、デフォルトの 'prompt'と' errorPrompt'を持っています一時停止しました。より良いが、それらを必要なパラメータにする。 'null'ではなく、すべての空白などではなく、エラーチェックを行うのが最も良いでしょう。 – TheLethalCoder

+0

また、それを一般的な方法にすることもできますが、最小値と最大値をデフォルトにすることはできません。それがあなたにとって悪いかどうかは、あなたの状況によって異なります。 – TheLethalCoder

+0

私はそのタイプのチェックをメソッドのユーザーに任せています。インデントに空白を使用するコードがいくつかあり、プロンプトがすでに表示されているので、このメソッドはプロンプトと空白エラーメッセージで呼び出されます。 –

関連する問題