C# c允许用户再次输入,直到正确为止

C# c允许用户再次输入,直到正确为止,c#,C#,我正在用c做一台自动取款机。它的一个功能是让用户在账户之间转账。如何使用户输入的转账金额无效(如负数),系统会提示用户再次输入金额,直到该金额有效?我尝试使用while循环,但当我输入一个负值行时,请输入一个有效的转账金额,只是不停地重复 Console.WriteLine("How much would you like to transfer?"); double transferamt = double.Parse(Console.ReadLine());

我正在用c做一台自动取款机。它的一个功能是让用户在账户之间转账。如何使用户输入的转账金额无效(如负数),系统会提示用户再次输入金额,直到该金额有效?我尝试使用while循环,但当我输入一个负值行时,请输入一个有效的转账金额,只是不停地重复

Console.WriteLine("How much would you like to transfer?");
                double transferamt = double.Parse(Console.ReadLine());
                if (transferamt < 0)
                {
                    Console.WriteLine("Please enter a valid amount to transfer");

                }              

您需要使用while循环,但提示再次阅读

while(transferamt < 0){
    Console.WriteLine("Please enter a valid amount to transfer");
    transferamt = double.Parse(Console.ReadLine());
}
您正在使用的if是一次性条件,如果您想继续重复它直到条件正确,则需要使用循环,例如,当:

使用double.TryParse。这将确保在用户输入无效格式时不会抛出任何验证。根据解析的成功将其包装在一个循环中

bool valid = false;
double amount;

while (!valid) 
{
    Console.WriteLine("How much would you like to transfer?");

    valid = double.TryParse(Console.ReadLine(), out amount);
} 
您需要为负值添加其他验证:

bool valid = false;
double amount;

while (!valid) 
{
    Console.WriteLine("How much would you like to transfer?");

    valid = double.TryParse(Console.ReadLine(), out amount)
        && amount > 0;
} 
C只处理表达式中确定输出所需的部分。在上面的例子中,如果double.TryParse。。。返回false,将不计算金额>0,因为false&&anything==false

如果值不是有效的double,Parse将引发异常。如果您的.NET版本中没有double.TryParse,您可以这样编写自己的:

public bool TryParse(string value, out double output)
{
    output = 0;

    try
    {
        double = double.Parse(value);
    }
    catch (Exception ex)
    {
        return false;
    }
}
如果您希望在以下尝试中使用不同的消息,可以将其稍微重写为:

double amount;

Console.WriteLine("How much would you like to transfer?");
bool valid = double.TryParse(Console.ReadLine(), out amount)
    && amount > 0;

while (!valid) 
{        
    Console.WriteLine("Please enter a valid amount to transfer?");
    valid = double.TryParse(Console.ReadLine(), out amount)
        && amount > 0;
} 
这可以重构为:

void Main()
{
    double amount = GetAmount();
}
double GetAmount()
{
    double amount = 0;
    bool valid = TryGetAmount("How much would you like to transfer?", out amount);

    while (!valid) 
    {        
        valid = TryGetAmount("Please enter a valid amount to transfer?", out amount);
    }

    return amount;
}
bool TryGetAmount(string message, out double amount)
{
    Console.WriteLine(message);
    return double.TryParse(Console.ReadLine(), out amount)
        && amount > 0;
}

大概不是真正的自动取款机……请让它成为真正的自动取款机!:这是编程的基本要求。我建议OP浏览一些免费的在线教程……当然,在一个理智的世界里,你不会让他们先按减号……你上一次使用ATM是什么时候,它允许你输入负数?这只有在用户输入有效的正数或负数双精度或零时才有效。任何其他输入都将导致异常。这仅在用户输入有效的正负双精度或零时有效。任何其他输入都会导致异常。do/while将是更好的重构,那么您不需要复制bool valid,我认为它也是一个编译器error@Sayse更好的重构是你的观点。我对do,while的看法很低,只是因为它没有像while那么频繁地使用,所以越少越好。此外,使用do,while将不允许自定义消息。若要在一段时间内允许使用备用消息,您将使用相同数量的代码,并且可能编译为相同的IL,因此没有任何好处。啊,我没有注意到自定义消息,正如您所说,这是一种意见。。我仍然认为这是一个编译器错误,尽管在重复声明的这个作用域@Sayse Good spot中已经定义了一个名为“valid”的局部变量。复制粘贴工作!这段代码没有经过测试,它是徒手编写的。我只是提供了其他的解决方案,可能有一些小的语法问题。这些帖子严重缺乏验证。我们都明白使用double.Parse的风险吗?没有人考虑无效输入,即非双精度输入,而不是OP负值指定的输入?!
void Main()
{
    double amount = GetAmount();
}
double GetAmount()
{
    double amount = 0;
    bool valid = TryGetAmount("How much would you like to transfer?", out amount);

    while (!valid) 
    {        
        valid = TryGetAmount("Please enter a valid amount to transfer?", out amount);
    }

    return amount;
}
bool TryGetAmount(string message, out double amount)
{
    Console.WriteLine(message);
    return double.TryParse(Console.ReadLine(), out amount)
        && amount > 0;
}
double transferamt=0;
do{
Console.WriteLine("Please enter a valid amount to transfer");
transferamt=double.Parse(Console.ReadLine());

}while(transferamt<0)