C# Convert.ToDecimal from输入字符串忽略点,但接受逗号

C# Convert.ToDecimal from输入字符串忽略点,但接受逗号,c#,.net,parsing,decimal,decimal-point,C#,.net,Parsing,Decimal,Decimal Point,我有一小段代码: using System; using System.Globalization; namespace project { class conditionalStatements { static void Main(string[] args) { Console.WriteLine("Enter a number greater than 45.2"); string answ

我有一小段代码:

using System;
using System.Globalization;

namespace project
{
    class conditionalStatements
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter a number greater than 45.2");
            string answer = Console.ReadLine();
            decimal answer_decimal = Convert.ToDecimal(answer);
            // decimal answer_decimal = Decimal.Parse(answer);
            decimal compareValue = 45.2m;

            Console.WriteLine(answer_decimal);
            //prints 452

            if(Decimal.Compare(answer_decimal, compareValue) > 0){
                // stuff
            }
            else{
                // should enter here
            }
        }
    }
 }
问题在于,由于方法
Convert.ToDecimal()
Decimal.Parse()
都忽略了十进制值的点表示法(或者至少我就是这样),因此数字被解释为
452
,而不是
45.2
。不管我输入多少点。事实上,如果我进入:

45......2
转换后的值仍将转换为
452
仅当我使用逗号时,转换后的数字才被正确解释为
45.2
,并且我能够输入
else
条件


我没有更改
NumberFormatInfo.CurrencyDecimalSeparator
。我将其保留为默认值。

使用将点视为十进制分隔符的给定区域性将输入字符串转换为十进制:

decimal answer_decimal = Convert.ToDecimal(answer, new CultureInfo("en-US"));

您可以尝试以下代码:

decimal answer_decimal; 
while(!decimal.TryParse(answer, out answer_decimal)){
    Console.WriteLine("Value entered could not be converted.");
}
decimal compareValue = 45.2m;

        Console.WriteLine(answer_decimal);
        //prints 452

        if(Decimal.Compare(answer_decimal, compareValue) > 0){
            // stuff
        }
        else{
            // should enter here
        }
这样可以防止程序在无法转换时崩溃。 如果要使用特定区域性,可以使用decimal.TryParse重载,如下所示:

decimal.TryParse(answer, System.Globalization.NumberStyles.Any, new System.Globalization.CultureInfo("EN-us"), out answer_decimal);

你的文化设定为Dari吗

我认为适用的是,而不是
decimal.Parse()
,直接调用或通过
Convert.ToDecimal()
调用,除非传递了一个带有
*currency*
标志之一的值,否则不知道解析的是什么货币

当调用一个重载
decimal.Parse()
时,该重载不接受默认的
numberstyle
参数。此复合样式包括样式、文档(强调我的)

如果
numberstyle
值包含
AllowCurrencySymbol
标志,并且解析的字符串包含货币符号,则十进制分隔符字符由
CurrencyDecimalSeparator
属性确定否则,十进制分隔符由
NumberDecimalSeparator
属性确定。

现在,是否有任何文化对数字和货币使用不同的十进制分隔符?让我们看看

CultureInfo.GetCultures(CultureTypes.AllCultures)
    .Where(culture => culture.NumberFormat.CurrencyDecimalSeparator != culture.NumberFormat.NumberDecimalSeparator);
在.NET Framework v4.7.2上生成少量区域性

fr-CH
kea
kea-CV
mr
mr-IN
prs
prs-AF
pt-CV
prs
prs-AF
调整LINQ查询以说明您看到的特定行为(货币十进制分隔符为
”,数字十进制分隔符为
”,“
,数字组分隔符为
”)

…将范围缩小到两种达里文化

fr-CH
kea
kea-CV
mr
mr-IN
prs
prs-AF
pt-CV
prs
prs-AF
果不其然,如果我事先把我的文化改成Dari

CultureInfo.CurrentCulture = new CultureInfo("prs");

…在我的系统上,您的代码的行为与您描述的完全相同。如果您不想使用区域性的分隔符,那么解决方案当然是在系统、线程或方法级别使用您想要的分隔符指定特定的或自定义的区域性。

什么区域性与线程关联?这是一条与您当前的问题无关的建议。切勿尝试在用户输入时使用Convert.toxxx。如果用户键入无效数字,代码将引发异常。在这些上下文中,始终使用decimal.tryparse该问题表示十进制分隔符(至少对于货币而言)已经是
。这解决了点的问题。但如果我想两者都用呢?因为在这种情况下,逗号也会出现同样的问题。难道没有办法同时接受他们吗?非常感谢您的帮助:)