Convert.ToDouble做一些奇怪的事情

时间:2015-04-30 11:00:02

标签: c#

我正在尝试通过

将用户输入字符串转换为double
Calculation.Rate = Convert.ToDouble(Console.ReadLine());

当我输入1时,Rate是预期的1,但是当我输入0.5时,Rate变为5.这可能是什么原因?

注意:

我宣布评价如下:

private double rate;
//property Rate
public double Rate
{
    get { return rate; }
    set { rate = value; }
}

3 个答案:

答案 0 :(得分:3)

将您的文化设置为例如英语:

System.Globalization.CultureInfo EnglishCulture = new System.Globalization.CultureInfo("en-EN");
var value = Console.ReadLine();
double.TryParse(value, System.Globalization.NumberStyles.Float, EnglishCulture,  out Calculation.Rate)

你所拥有的问题是可能的,因为你有德国文化或其他期望','而不是'。'在读/解析浮点数/双数时。

答案 1 :(得分:1)

要检查数字小数分隔符和组号分隔符,您可以执行以下操作:

 var numberDecimalSeparator = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator;
 var numberGroupSeparator = CultureInfo.CurrentUICulture.NumberFormat.NumberGroupSeparator;

我想你的情况'。'用作数字组分隔符。

答案 2 :(得分:1)

您的文化设置可能存在问题。

.NET中几乎每个Parse函数都有一个重载来为他提供文化设置。文化设置包含NumberDecimalSeparatorNumberGroupSeparator等信息,这些信息可能因文化而异。使用当前文化将文本转换为double。

示例:

using System.Globalization;
...
CultureInfo myCulture = new CultureInfo("en-US");
Calculation.Rate = Convert.ToDouble(Console.ReadLine(), myCulture);

当然,这样您每次进行转换时都必须使用这种文化。最好将您的文化作为主动威胁的默认文化:

using System.Globalization;
using System.Threading;
...
// Set the current culture once on the active thread.
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
...
// Now convert everything using this culture.
Calculation.Rate = Convert.ToDouble(Console.ReadLine());

警告:这仅适用于活动线程。如果您使用多个线程,请在每个威胁上设置文化。

在ASP.NET应用程序中,您可以为每个请求(或处理每个请求的每个威胁)定义默认文化:

<configuration>
   <system.web>
      <globalization culture="en-US" />
   </system.web>
</configuration>

如果要更改所有应用程序的当前区域性,可以考虑在区域设置下的Windows窗口中更改文化设置。