![](/img/trans.png)
[英]System.FormatException received when while loop added to console calculator
[英]system.formatexception in while(true) loop
题目是一个小问题:写一个程序,不断要求用户输入一个数字或者“ok”退出。 计算所有先前输入的数字的总和并将其显示在控制台上。
这是我的代码:
var sum = 0;
while (true)
{
Console.WriteLine("Enter a number or ok to exit:");
if (Console.ReadLine() == "ok") break;
sum += Convert.ToInt32(Console.ReadLine());
Console.WriteLine(sum);
}
当我点击确定时,它终止。 当我点击数字并输入时,它显示 system.formatexception:输入的字符串格式不正确。 我知道解决方案之一是
var sum = 0;
while (true)
{
Console.Write("Enter a number (or 'ok' to exit): ");
var input = Console.ReadLine();
if (input.ToLower() == "ok")
break;
sum += Convert.ToInt32(input);
}
Console.WriteLine("Sum of all numbers is: " + sum);
也许我的代码看起来有点奇怪,但为什么我的代码错了?
原因是input
将“确定”。 无法将其转换为整数。
然后将该字符串转换为整数并求和。
var sum = 0; while (true) { Console.Write("Enter a number (or 'ok' to exit): "); var input = Console.ReadLine(); int newVariable = 0; if (input.ToLower() != "ok") { newVariable = Convert.ToInt32(input); } input = Console.ReadLine(); if (input.ToLower() == "ok"){ break; sum += newVariable; } } Console.WriteLine("Sum of all numbers is: " + sum);
如果这里有任何问题,请告诉我。
尝试这个:
var sum = 0;
while (true)
{
Console.WriteLine("Enter a number or ok to exit:");
String ans = Console.ReadLine();
if (ans == "ok" || ans.ToLower() == "ok") break;
sum += Convert.ToInt32(ans);
Console.WriteLine(sum);
}
在这里,我只是将用户输入的输入存储在一个变量中,并在进一步处理中使用该变量。
在您的第一个代码中,您输入了两次,第一个在 IF 条件下,第二个在解析中,这可能会导致问题。
正确的方法是使用int.TryParse
将string
转换为数字。 TryParse
尝试将字符串转换为数字,但如果不能这样做(例如,字符串包含的不仅仅是数字),它将正常失败而不是导致异常。 如果输入非数字内容而不是"ok"
,到目前为止的其他答案都会导致未处理的FormatException
。 通过使用int.TryParse
您可以处理它是有效数字的情况,以及无效的情况,然后提醒用户。 以下是代码上下文中的示例:
// I prefer using concrete types for numbers like this, so if anyone else
// reads it they know the exact type and numeric limits of that type.
int sum = 0;
int enteredNumber = 0;
while (true)
{
Console.Write("Enter a number (or 'ok' to exit): ");
var consoleInput = Console.ReadLine();
if (consoleInput.ToLower() == "ok")
break;
if(int.TryParse(consoleInput, out enteredNumber))
{
sum += enteredNumber;
}
else
{
Console.WriteLine("You entered '" + consoleInput + "', which is not a number.");
}
}
Console.WriteLine("Sum of all numbers is: " + sum.ToString());
这更好,因为您知道除了自己验证之外,您无法控制用户的输入,因此最好推测性地转换数字并在不触发异常的情况下收到成功或失败的警报。 用 try/catch 块包装所有内容不是一个正确的解决方案。
正如评论中正确指出的那样,您的第一个代码示例读取一行,测试它是否为“ok”,然后将其丢弃,读取另一行,并使用它添加到总和中,这不是您想要的。
经过一些快速的研究,我会说在 C# 中处理这个问题的最简洁的方法可能类似于你的第二个代码示例。 在 F# 中,我能够想出以下示例(一个是循环,另一个使用序列,即IEnumerable<_>
s),但我没有找到与 C# 和 LINQ 相同的简洁方法……
let inputLoop () =
let rec aux sum =
match stdin.ReadLine () with
| "ok" -> sum
| s -> aux (sum + int s)
stdout.WriteLine (aux 0 |> string)
let inputSeq () =
fun _ -> stdin.ReadLine ()
|> Seq.initInfinite
|> Seq.takeWhile (fun s -> s <> "ok")
|> Seq.sumBy int
|> string
|> stdout.WriteLine
尝试一下 :)
var sum = 0;
while (true)
{
Console.Write("Enter a number: or ok to exit : ");
String input = Console.ReadLine();
if (input == "ok" || input.ToLower() == "ok") break;
if(string.IsNullOrWhiteSpace(input))
continue;
sum += Convert.ToInt32(input);
}
Console.WriteLine("Total Result: " + sum);
编写程序并不断要求用户输入数字或“确定”退出。 计算所有先前输入的数字的总和并将其显示在控制台上。 快乐编码
var sum = 0;
while (true)
{
Console.Write("Write number or write \"ok\" for exit: ");
var input = Console.ReadLine();
if (input.ToLower() != "ok")
{
sum += Convert.ToInt32(input);
continue;
}
break;
}
Console.WriteLine("All sum: " + sum + ".");
这是一种方法。 我只是在学习这样做!
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter number to know the sum or press ok to exit and display the sum");
int sum = 0;
while (true) // to run the program continously asking user input
{
Console.WriteLine("Enter Number: ");
var input = Console.ReadLine(); // takes user input
if (input.ToLower() == "ok") // compares user input to string ok
break; //if user input is ok, breaks the loop and sum is displayed
var inputInInt = Convert.ToInt32(input); // if user input is int, continues to convert it to integer
sum += inputInInt; // user input in interger is added to sum
}
Console.WriteLine("The sum of entered numbers is: " + sum);
Console.ReadLine();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.