我正在尝试通过
将用户输入字符串转换为doubleCalculation.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; }
}
答案 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函数都有一个重载来为他提供文化设置。文化设置包含NumberDecimalSeparator
和NumberGroupSeparator
等信息,这些信息可能因文化而异。使用当前文化将文本转换为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窗口中更改文化设置。