C#,将字符串转换为double的最佳方式是什么?
我一直在寻找已经回答了这个问题的解决方案,但他们没有一个似乎与我的代码一起工作。我只是刚刚开始在C#中编写代码,而且我很困惑我的代码是如何工作的。C#,将字符串转换为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: ");
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。当我运行程序时,它循环一次,程序冻结。如果我在控制台输入,它给了我这个错误:
Unhandled Exception:
System.FormatException: Input string was not in a correct format.
at System.Number.ParseDouble (System.String value, System.Globalization.NumberStyles options, System.Globaliz
at System.Double.Parse (System.String s, System.Globalization.NumberStyles style, System.Globalization.Number
at System.Double.Parse (System.String s, System.IFormatProvider provider) [0x0000c] in at dturato.Averager.Main() [0x00058] in <249eeff07c4a4744a6b024a0c9b6c23b>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.FormatException: Input string was not in a correct format.
at System.Number.ParseDouble (System.String value, System.Globalization.NumberStyles options, System.Globaliz
at System.Double.Parse (System.String s, System.Globalization.NumberStyles style, System.Globalization.Number
at System.Double.Parse (System.String s, System.IFormatProvider provider) [0x0000c] in at d.Averager.Main() [0x00058] in <249eeff07c4a4744a6b024a0c9b6c23b>:0**
这一点,从我目前为止的研究,意味着字符串没有被转换为双出于某种原因。如果任何人都可以提供帮助或提供任何好的解决方案,谢谢。
您打电话给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;
}
}
}
}
}
这工作!感谢您的帮助,不知道我怎么没有意识到,从一开始 –
这个答案甚至没有试图回答真正的问题 - “将字符串转换为双精度的最佳方式是什么?” ...也许问题需要编辑 –
该错误告诉您具体的问题。
Input string was not in a correct format.
您需要确保解析方法中的输入有效。在大多数情况下,您会发现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;
}
}
}
}
}
我只是把这些东西它变成一个双马上蝙蝠 - 使用“Convert.toDouble(yourValue)”,它表示你已经在做检查,看看你是否会得到一个数值或一个字符串,那么为什么不跳过这个var并且让它立刻变成双重的?
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: ");
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;
}
}
}
}
}
您是否试过单步执行代码以查看抛出异常时传入'tempNew'的内容? – greenjaed
请仔细阅读[MCVE]关于发布代码的指导(帖子中的帖子显然不是最小的)。还要确保提供你认为“更好”的东西(或者当你需要“工作解决方案”时不要求“最好”)。 –