C# 为什么Convert.ToDecimal(3.1922)显示为31922?
我正在读取一个包含值的XML文件。当我读它们时,它们是字符串 因此,当我尝试将它们转换为C# 为什么Convert.ToDecimal(3.1922)显示为31922?,c#,number-formatting,C#,Number Formatting,我正在读取一个包含值的XML文件。当我读它们时,它们是字符串 因此,当我尝试将它们转换为Double或Decimal时,点消失了 decimal dec = Convert.ToDecimal("3.1922"); MessageBox.Show(dec.ToString()); // 31922 我做错了什么?在您当前的文化中,用作分隔符。您可以通过以下方式进行验证: var culture = Thread.CurrentThread.CurrentCulture
Double
或Decimal
时,点消失了
decimal dec = Convert.ToDecimal("3.1922");
MessageBox.Show(dec.ToString()); // 31922
我做错了什么?在您当前的文化中,
用作分隔符。您可以通过以下方式进行验证:
var culture = Thread.CurrentThread.CurrentCulture;
var numberFormat = culture.NumberFormat;
string groupSeparator = numberFormat.NumberGroupSeparator; // will be .
string decimalSeparator = numberFormat.NumberDecimalSeparator; // will be ,
您可以指定所需的区域性以进行分析:
decimal dec = Decimal.Parse("3.1922", new CultureInfo("en-US"));
或者,您可以将区域性设置为当前:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
decimal dec = Decimal.Parse("3.1922");
这与你目前的文化有关
decimal dec = Convert.ToDecimal("3.1922",CultureInfo.CreateSpecificCulture("de-DE"));
MessageBox.Show(dec.ToString()); //31922
dec = Convert.ToDecimal("3.1922", CultureInfo.CreateSpecificCulture("en-US"));
MessageBox.Show(dec.ToString()); //3.1922
dec = Convert.ToDecimal("3,1922", CultureInfo.CreateSpecificCulture("de-DE"));
MessageBox.Show(dec.ToString()); //3.1922
检查您的NumberFormat.NumberDecimalSeparator 在初始化组件()之后,首先将这些代码添加到
公共表单1()
代码>:
public Form1()
{
InitializeComponent();
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
}
然后,在任何需要的地方使用代码:
decimal dec = Convert.ToDecimal("3.1922");
MessageBox.Show(dec.ToString());
更新:
如果不想进行全局更改,则应在显示小数点之前添加代码
private void ShowDecimal_Click(object sender, EventArgs e)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
decimal dec = Convert.ToDecimal("3.1922");
MessageBox.Show(dec.ToString());
}
更新2:
decimal dec = Decimal.Parse("3.1922", new CultureInfo("en-US"));
MessageBox.Show(dec.ToString());
@你怎么知道尼尔斯的文化?例如,德国文化使用
作为千位分隔符。我指的是一般的美国文化。此处未指定区域性。当我运行代码时。显示良好。此处未指定区域性,因此,为什么您确定OP环境的当前区域性?@Ons没有指定区域性,则使用本地区域性。你不能假设这种文化就是美国文化。必须显式使用InvariantCulture
,此代码才能可靠工作。这实际上是正确的。因此,在这种情况下,我们可以先使用区域性不变量,它会正常工作吗?您也应该添加推荐的解决方案,即显式指定CultureInfo.InvariantCulture
。那么,最好的方法是什么呢?使用CultureInfo.InvariantCulture或创建“有效”的区域性。也就是说,CreateSpecificCulture(“en-US”)的工作方式与我所希望的一样。@Niels这取决于您的具体情况,但如果您想使代码适用于许多地区,请使用CultureInfo.InvariantCulture
@L.B。谢谢您的回答。XML中的值将始终采用这种格式,我的应用程序的GUI将始终采用英语。那么,什么是最好的解决方案呢?@Niels我会使用InvariantCulture
Global change for local problem=>Baddesign@CodesInChaos他可以在他的密码之前改变。我只是给他指路;)这让情况变得更糟。因为现在单击按钮会全局更改状态,而不会恢复状态。