【问题标题】:c# allow user to input again until correct [closed]c#允许用户再次输入直到正确[关闭]
【发布时间】:2013-09-07 09:14:57
【问题描述】:

我正在用 c# 制作一台 ATM。它的功能之一是让用户在他们的账户之间转账。怎么做才能让用户输入无效的转账金额(如负金额),提示用户再次输入金额直到有效?我尝试使用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");

                }              

【问题讨论】:

  • 大概不是真正的自动取款机......(请让它成为真正的自动取款机!):)
  • 这和编程一样基本。我建议 OP 浏览一些免费的在线教程...
  • 当然,在一个理智的世界里,你不会让他们一开始就按减号......你最后一次使用 ATM 是什么时候,它让你输入负数金额?

标签: c#


【解决方案1】:

使用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,amount &gt; 0将不会被计算,因为false &amp;&amp; anything == false

double.Parse 如果值不是有效的双精度值,将抛出异常。如果double.TryParse 在您的 .NET 版本中不可用,您可以像这样编写自己的:

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;
}

【讨论】:

  • do/while 会是一个更好的重构,那么你就不需要复制bool valid,我也认为这是一个编译器错误
  • @Sayse “更好的重构”是您的意见。我对do, while 的看法非常低,仅仅是因为它不像while 那样经常使用,所以少即是“舒适”。此外,使用do, while 将不允许自定义消息。为了在一段时间内允许交替消息,您将使用相同数量的代码(并且可能编译为相同的 IL),因此没有任何好处。
  • 啊,我没有注意到自定义消息,正如您所说的那样。我仍然认为这是编译器错误(已在此范围内定义了名为“有效”的局部变量)
  • @Sayse 重复声明的好地方。复制粘贴工作!此代码未经测试,它是徒手的。我只是提供替代解决方案,可能存在一些小的语法问题。
【解决方案2】:

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

while(transferamt < 0){
    Console.WriteLine("Please enter a valid amount to transfer");
    transferamt = double.Parse(Console.ReadLine());
}

【讨论】:

  • 这仅在用户输入有效的正或负双精度(或零)时有效。任何其他输入都会导致异常。
【解决方案3】:

您正在使用if 这是一个一次性条件,如果您想继续重复它直到条件正确,那么您需要使用循环,例如while:

double transferamt = -1;
while (transferamt < 0)
{
    Console.WriteLine("Please enter a valid amount to transfer");
    transferamt = double.Parse(Console.ReadLine());
}  

【讨论】:

  • 这仅在用户输入有效的正或负双精度(或零)时有效。任何其他输入都会导致异常。
【解决方案4】:
double transferamt=0;
do{
Console.WriteLine("Please enter a valid amount to transfer");
transferamt=double.Parse(Console.ReadLine());

}while(transferamt<0)

【讨论】:

  • 这些帖子严重缺乏验证。我们都了解使用double.Parse 的风险吗?除了OP(负值)指定的输入之外,没有人考虑无效输入(即非双精度)吗?!
猜你喜欢
  • 2022-11-16
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
相关资源
最近更新 更多