我有以下方法,我想将输入部分与验证部分分开,即我想在一个方法(ReadInput
)中读取输入并断言输入值的类型为{{ 1}}在另一种方法(double
)中。我怎么能这样做?
AssertIsDouble
我尝试了以下但是没有用:
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).");
}
}
}
答案 0 :(得分:1)
我使用out
参数并从bool
方法返回Assert
。
免责声明:代码未经测试但应该有效。
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 :(得分: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}");
该方法处理剩下的事情: