簡體   English   中英

C#,將String轉換為double的最佳方法是什么?

[英]C# , What is the best way of converting a String to a 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;
        }

      }
    }
  }
}

在上面的代碼中,我試圖將輸入的字符串轉換為雙精度型。 當我運行該程序時,它循環一次,並且程序凍結。 如果我在控制台中鍵入,則會出現此錯誤:

未處理的異常:

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]在dturato.Averager.Main()中的[0x00058]在<249eeff07c4a4744a6b024a0c9b6c23b>: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]在d.Averager.Main()中的[0x00058]在<249eeff07c4a4744a6b024a0c9b6c23b>:0 **中

根據我到目前為止的研究,這意味着String由於某種原因沒有轉換為double。 如果有人可以幫助或提供任何出色的解決方案,謝謝。

您要兩次致電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;
        }

      }
    }
  }
}

該錯誤告訴您確切的問題。

輸入的字符串格式不正確。

您需要確保對parse方法的輸入有效。 在大多數情況下,您會發現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並使其立即變倍?

使用系統;

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

   }
  }
 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM