我一直在寻找已经解答过的问题的解决方案,但它们似乎都不适用于我的代码。我刚刚开始使用C#进行编码,我很困惑我的代码是如何工作的。
using System;
namespace dt
{
class Averager
{
static void Main()
{
var total = 0.0;
int runningNumbers = 0;
while(true)
{
Console.Write("Enter a number or type \"done\" to see the average: ");
if(Console.ReadLine().ToLower() == "done")
{
var average = (total / runningNumbers);
Console.Write("Average: " + average);
break;
}
else
{
var tempNew = Double.Parse(Console.ReadLine());
total += tempNew;
runningNumbers += 1;
continue;
}
}
}
}
}
在上面的代码中,我正在尝试将输入的字符串转换为double。当我运行程序时,它循环一次,程序冻结。如果我输入控制台,它会给我这个错误:
未处理的例外:
System.FormatException:输入字符串的格式不正确 在System.Number.ParseDouble(System.String值,System.Globalization.NumberStyles选项,System.Globaliz
在System.Double.Parse(System.String s,System.Globalization.NumberStyles样式,System.Globalization.Number
在System.Double.Parse(System.String s,System.IFormatProvider提供程序)[0x0000c]中 at dturato.Averager.Main()[0x00058] in< 249eeff07c4a4744a6b024a0c9b6c23b&gt ;:0
[错误]致命的未处理的异常:System.FormatException:输入字符串的格式不正确。
在System.Number.ParseDouble(System.String值,System.Globalization.NumberStyles选项,System.Globaliz
在System.Double.Parse(System.String s,System.Globalization.NumberStyles样式,System.Globalization.Number
在System.Double.Parse(System.String s,System.IFormatProvider提供程序)[0x0000c]中 at d.Averager.Main()[0x00058] in< 249eeff07c4a4744a6b024a0c9b6c23b&gt ;:0 **
根据我迄今为止所研究的内容,这意味着String由于某种原因没有转换为double。如果有人可以帮助或提供任何可能很棒的解决方案,谢谢。
答案 0 :(得分:3)
您正在拨打ReadLine
两次!第一次是在提示之后。第二个是你的if语句的else
子句。第二个可能为null,并在尝试转换为double时导致错误。您需要将输入值存储到变量中:
using System;
namespace dt
{
class Averager
{
static void Main()
{
var total = 0.0;
int runningNumbers = 0;
while(true)
{
Console.Write("Enter a number or type \"done\" to see the average: ");
string input = Console.ReadLine();
if(input.ToLower() == "done")
{
var average = (total / runningNumbers);
Console.Write("Average: " + average);
break;
}
else
{
var tempNew = Double.Parse(input);
total += tempNew;
runningNumbers += 1;
continue;
}
}
}
}
}
答案 1 :(得分:3)
错误告诉您确切的问题。
输入字符串的格式不正确。
您需要确保解析方法的输入有效。在大多数情况下,您会找到Parse方法的TryParse变体。在这种情况下,double.TryParse就是这样做的。
using System;
public class Example
{
public static void Main()
{
string value;
double number;
value = Double.MinValue.ToString();
if (Double.TryParse(value, out number))
Console.WriteLine(number);
else
Console.WriteLine("{0} is outside the range of a Double.",
value);
value = Double.MaxValue.ToString();
if (Double.TryParse(value, out number))
Console.WriteLine(number);
else
Console.WriteLine("{0} is outside the range of a Double.",
value);
}
}
// The example displays the following output:
// -1.79769313486232E+308 is outside the range of the Double type.
// 1.79769313486232E+308 is outside the range of the Double type.
要引用您的代码,您最初的问题是您多次读取输入:试试这个
using System;
namespace dt
{
class Averager
{
static void Main()
{
var total = 0.0;
int runningNumbers = 0;
while (true)
{
// Ask for user for a new input
Console.Write("Enter a number or type \"done\" to see the average: ");
var line = Console.ReadLine();
// Try to parse the input
double value;
if(double.TryParse(line, out value)) {
total += value;
runningNumbers += 1;
continue;
} else if(line.ToLower() == "done")
{
var average = (total / runningNumbers);
Console.Write("Average: " + average);
break;
} else {
Console.Write("Invalid input. Please try again.");
continue;
}
}
}
}
}
答案 2 :(得分:1)
我只是把它塞进一个双重权利 - 使用“Convert.toDouble(yourValue)。它知道你已经在检查你是否会得到一个数值或一个字符串,为什么不要跳过var并立即将其变为双倍?
使用System;
namespace dt{
class Averager
static void Main(){
var total = 0.0;
int runningNumbers = 0;
while(true)
{
Console.Write("Enter a number or type \"done\" to see the average: ");
var test = Console.Readline();
if(test.ToLower() == "done")
{
var average = (total / runningNumbers);
Console.Write("Average: " + average);
break;
}
else
{
double tempNew = Convert.toDouble(test);
total += tempNew;
runningNumbers += 1;
continue;
}
}
}
}
}