2012-02-14 105 views
2

我是C#編程的新手,我不確定我做錯了什麼,因爲我無法總結出Double的數字。如果我輸入2,5和2,5我得到5,但如果我輸入2.5和2.5,當我使用點而不是數字之間的逗號時,我得到零。爲什麼這個?總結雙倍ReadLine值?

我加了一些我的代碼:

private void ReadInputAndSumNumbers() 
    { 
     while (!done) 
     { 
      Console.Write("Number: "); 
      if (double.TryParse(Console.ReadLine(), out num)) 
      { 
       if (num == 0) 
       { 
        done = true; 
       } 
       else 
       { 
        sum += num; 
       } 
      } 
     } 
    } 

我的設置使用逗號,但我希望用戶能夠輸入與點也

+2

你能告訴你的輸入代碼? – 2012-02-14 09:29:51

+1

接受編號的格式取決於您的文化設置 – 2012-02-14 09:30:20

+0

您可以顯示您的C#代碼嗎? – 2012-02-14 09:31:41

回答

4

值你怎麼轉換你的ReadLine輸入成雙精度?大多數轉換操作都是特定於語言環境的,因此如果您的Windows設置具有小數點分隔符,,則會遵守此設置。

例子:

string enteredByUser = Console.ReadLine(); 

// uses user-specific Windows settings (decimal separator might be ",") 
double myDouble1 = double.Parse(enteredByUser); 

// uses default settings (decimal separator is always ".") 
double myDouble2 = double.Parse(enteredByUser, CultureInfo.InvariantCulture); 

短邊注:如果您分析用戶的輸入,你應該看看double.TryParse,因爲這是比double.ParseConvert.ToDouble更健壯,因爲它允許您檢測錯誤的輸入而不訴諸異常處理。


編輯:如果你想支持逗號和點,你需要點首先轉換成逗號(反之亦然)。 String.Replace可以幫助你在這裏。但請注意,如果用戶嘗試輸入千位分隔符(1.000,00 - >1.000.001,000,00 - >錯誤),則此方法會中斷。推薦的方式來做到這一點是

  • 只接受在Windows中指定的小數點分隔符,如果輸入來自最終用戶(即,保持你的代碼,因爲它是)和
  • 只接受中性文化(.),如果輸入來自某些機器生成的輸出或文件。
+0

嗨,我試圖使用你的代碼是這樣的:if(double.TryParse(Console.ReadLine(),CultureInfo.InvariantCulture,out num))但它不工作?!我究竟做錯了什麼? – 2012-02-14 10:24:44

+0

@ 3D-kreativ:你做錯了什麼?在使用之前,您沒有閱讀過double.TryParse的文檔。 ;-)在我的答案中點擊「double.TryParse」後面的鏈接。 – Heinzi 2012-02-14 11:22:14

0

一種caculate樣品雙總和

static void Main(string[] args) 
{ 
    var retVal = 0.0; 
    var sum = 0.0; 
    while (true) 
    { 
     Console.WriteLine("Enter input:"); 
     string line = Console.ReadLine(); 
     if (line == "exit") 
     { 
      break; 
     } 


     double.TryParse(line, NumberStyles.Any, CultureInfo.InvariantCulture, out retVal); 
     sum += retVal; 

     Console.WriteLine(string.Format("Double Value : {0}", sum)); 
    } 

    Console.ReadKey(); 
}