我写了一个程序来模拟收银机的运作方式。
如果用户输入的是字母而不是数字,我需要一些如何使程序得到处理的帮助。
然后我希望用户输入的字母丢失,用户会收到从头开始的新机会。
我已经使用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();
}
}
热烈欢迎任何帮助。
答案 0 :(得分:10)
首先 - 更重要的是 - 对于货币值,您应该使用decimal
而不是double
。十进制浮点数更适合货币值,货币值以十进制精确表示 - 而二元浮点类型(double
和float
)更适合“自然”值,如身高和体重,无论如何,它永远不会有绝对精确的测量值。有关详细信息,请参阅binary floating point和decimal floating point上的文章。
接下来,我建议您使用decimal.TryParse
- 而不是使用异常处理进行此验证,而不是使用它来返回它是否成功。这样你就不必使用try / catch来捕获一个可以轻易避免的非常可预测的异常。例如:
decimal value;
while (!decimal.TryParse(Console.ReadLine(), out value))
{
Console.WriteLine("Sorry, that wasn't a valid number");
}
答案 1 :(得分:4)
您应该使用int.TryParse
。如果输入不是有效整数,则返回false。
如果返回false,则可以使用此方法提示用户输入其他值。
修改的
正如Jon Skeet指出的那样,在处理货币时你真的应该使用decimal
类型。
答案 2 :(得分:1)
使用try parse:
decimal totalAmount;
bool ok = decimal.TryParse(outConsole.ReadLine(), out totalAmount);
if(!ok){
//Bad input. Do something
}else{
//input ok, continue
}
使用相同的方法解析整数。
答案 3 :(得分:0)
而不是
totalAmount = double.Parse(Console.ReadLine());
做
boolean isDouble = double.TryParse(Console.ReadLine(), out totalAmount);
然后检查
if(isDouble)...