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**

这一点,从我目前为止的研究,意味着字符串没有被转换为双出于某种原因。如果任何人都可以提供帮助或提供任何好的解决方案,谢谢。

+0

您是否试过单步执行代码以查看抛出异常时传入'tempNew'的内容? – greenjaed

+0

请仔细阅读[MCVE]关于发布代码的指导(帖子中的帖子显然不是最小的)。还要确保提供你认为“更好”的东西(或者当你需要“工作解决方案”时不要求“最好”)。 –

您打电话给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; 
     } 

     } 
    } 
    } 
} 
+0

这工作!感谢您的帮助,不知道我怎么没有意识到,从一开始 –

+0

这个答案甚至没有试图回答真正的问题 - “将字符串转换为双精度的最佳方式是什么?” ...也许问题需要编辑 –

该错误告诉您具体的问题。

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; 
    } 

    } 
    } 
} 
}