【问题标题】:Use of try - catch for taking care of letters使用 try-catch 处理字母
【发布时间】:2013-11-18 14:36:07
【问题描述】:

我编写了一个程序来模拟收银机的工作方式。

如果用户输入字母而不是数字,我需要一些帮助来处理程序。

然后我希望用户输入的字母丢失并且用户获得从头开始的新机会。

我已经使用 try 和 catch 为其编写了一些代码,但不确定应该如何编写。

class Program
{
    static void Main(string[] args)
    {
        int cash = 0;                    
        double totalAmount = 0;                     
        uint subTotal;                  
        int exchange;                   
        double roundingOffAmount;               

        Console.Write("Please enter a total amount for the cash register    : ");
        totalAmount = double.Parse(Console.ReadLine());

        if (totalAmount < 1)
        {
            Console.BackgroundColor = ConsoleColor.Red;
            Console.WriteLine("\nTotalamount needs to be more\n");
            Console.ResetColor();
            Environment.Exit(0);
        }

        try
        {
            Console.Write("Please enter cash for the cash register: ");
            cash = int.Parse(Console.ReadLine());
            if (cash < totalAmount)
            {
                Console.BackgroundColor = ConsoleColor.Red;
                Console.WriteLine("\nCash needs to be more than totalAmount\n");
                Console.ResetColor();
                Environment.Exit(0);
                Console.WriteLine();
            }
            else
            {
                // Do nothing
            }
        }
        catch (FormatException)
        {
           Console.Write("\nSorry you typed in a letter you need to type in a number");
            Console.WriteLine();
            Console.BackgroundColor = ConsoleColor.Red;
            Console.WriteLine("\nSomething went wrong, please try again");
            Console.ResetColor();
            Console.WriteLine();               
            Main(args);
        }

        subTotal = (uint)Math.Round(totalAmount);
        roundingOffAmount = subTotal - totalAmount;

        exchange = cash - (int)totalAmount;

        Console.WriteLine("\n Receipt"
                        + "\n ------------------------------------"
                        + "\n Totalt \t: \t {0:c}", totalAmount);
        Console.WriteLine(" RoundingOffAmount\t: \t {0:f2}", roundingOffAmount);
        Console.WriteLine(" To pay \t: \t {0:c}", subTotal);
        Console.WriteLine(" Cash \t: \t {0:c}", cash);
        Console.WriteLine(" Exchange \t:\t {0:c}", exchange
                        + "\n ------------------------------------");
        Console.WriteLine();
    }
}

热烈欢迎任何帮助。

【问题讨论】:

  • 尝试使用TryParse()方法msdn.microsoft.com/en-us/library/…
  • 这仍然是一个控制台应用程序吗?您应该在前端和后端的两个级别上添加此检查。后端应该简单地抛出一个异常,因为它通常不应该被访问(前端不应该允许用户尝试提交错误的数据)。如果这最终将是一个网站/WPF 应用程序/...,那么您最好在此时添加验证。
  • 提示:查找 TryParse

标签: c# exception try-catch


【解决方案1】:

首先 - 更重要的是 - 对于货币价值,您应该使用 decimal 而不是 double。十进制浮点数更适合以十进制精确表示的货币值 - 而二进制浮点类型(doublefloat)更适合“自然”值,例如身高和体重,它们永远不会有无论如何,绝对精确的测量值。有关详细信息,请参阅我在 binary floating pointdecimal floating point 上的文章。

接下来,我建议您使用decimal.TryParse,而不是使用异常处理来进行验证,它会返回验证是否成功。这样你就不必使用 try/catch 来捕获一个可以轻松避免的非常可预测的异常。例如:

decimal value;
while (!decimal.TryParse(Console.ReadLine(), out value))
{
    Console.WriteLine("Sorry, that wasn't a valid number");
}

【讨论】:

    【解决方案2】:

    您应该使用int.TryParse。如果输入不是一个有效的整数,这将返回 false。

    如果它返回false,你可以用它来提示用户输入另一个值。

    编辑

    正如 Jon Skeet 所指出的,在处理货币时您确实应该使用 decimal 类型。

    【讨论】:

      【解决方案3】:

      使用尝试解析:

      decimal totalAmount;
      bool ok =  decimal.TryParse(outConsole.ReadLine(), out totalAmount);
      if(!ok){
      //Bad input. Do something
      }else{
      //input ok, continue
      }
      

      使用相同的方法解析整数。

      【讨论】:

      • 参数是其他方式。 TryParse 返回 bool,out 参数为 double
      • 感谢@SriramSakthivel!固定
      【解决方案4】:

      而不是

      totalAmount = double.Parse(Console.ReadLine());
      

       boolean isDouble = double.TryParse(Console.ReadLine(), out totalAmount);
      

      然后检查

      if(isDouble)...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多