2012-02-14 48 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(); 
}