C# 为什么Convert.ToDecimal(3.1922)显示为31922?

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

我正在读取一个包含值的XML文件。当我读它们时,它们是字符串

因此,当我尝试将它们转换为
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他可以在他的密码之前改变。我只是给他指路;)这让情况变得更糟。因为现在单击按钮会全局更改状态,而不会恢复状态。