C#,将String转换为double的最佳方法是什么?

时间:2017-04-25 21:35:13

标签: c# string double

我一直在寻找已经解答过的问题的解决方案,但它们似乎都不适用于我的代码。我刚刚开始使用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。如果有人可以帮助或提供任何可能很棒的解决方案,谢谢。

3 个答案:

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

   }
  }
 }
}