C# Convert.ToDecimal不';t转换输入十进制数

C# Convert.ToDecimal不';t转换输入十进制数,c#,decimal,C#,Decimal,我是c#新手,尝试将输入转换为十进制和双精度。当我输入一个整数时,它可以正常工作,但当我输入一个十进制或双精度数字时,它会立即停止,并给出一条“Exception Unhandled”(异常未处理)错误消息 我的代码: Console.Write("Enter number: "); decimal d = Convert.ToDecimal(Console.ReadLine()); Console.WriteLine(d); 所以当我输入3时,程序会打印出数字3。但如果我输入3.6,它就会

我是c#新手,尝试将输入转换为十进制和双精度。当我输入一个整数时,它可以正常工作,但当我输入一个十进制或双精度数字时,它会立即停止,并给出一条“Exception Unhandled”(异常未处理)错误消息

我的代码:

Console.Write("Enter number: ");
decimal d = Convert.ToDecimal(Console.ReadLine());

Console.WriteLine(d);
所以当我输入3时,程序会打印出数字3。但如果我输入3.6,它就会停止

我看到了另一个使用Double.Parse()的解决方案;但我的代码仍然无法正常工作

Console.Write("Enter number: ");
decimal d = Decimal.Parse(Console.ReadLine());

Console.WriteLine(d);
在我的代码中,我使用的是十进制,但对double也是一样

我试图查找其他类似的问题(stackoveflow,google),我已经查看了文档,但找不到问题。
我的代码有什么问题吗?

正如评论中提到的,不同国家的代码有不同。我建议手动将输入的符号替换为区域性中使用的分隔符:

string separator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
decimal d = Decimal.Parse(Console.ReadLine().Replace(".", separator).Replace(",", separator));

所有字符串转换操作都使用当前区域性,这可能在十进制或千位分隔符等方面有所不同。您可以在以下任何转换中指定区域性:

decimal d=Convert.ToDecimal(Console.ReadLine(),CultureInfo.InvariantCulture);
decimal d=decimal.Parse(Console.ReadLine(),CultureInfo.InvariantCulture);
另一个选项是在应用程序开始时设置默认区域性,这将影响将来的所有转换:

CultureInfo.CurrentCulture=CultureInfo.DefaultThreadCurrentCulture=CultureInfo.InvariantCulture;

好吧,如果您在财务中使用
十进制
,您可能不仅希望接受十进制分隔符,而且希望接受组(千)一:

这里的
是一个十进制分隔符,当
是分组分隔符时。要支持组分隔符,您可以指定
numberstyle.Any

   Console.Write("Enter number: ");

   decimal d;

   while (!Decimal.TryParse(Console.ReadLine(), NumberStyles.Any, null, out d)) 
     Console.WriteLine("Invalid syntax. Please, try again."); 
请注意,我在这里输入了表示
CultureInfo.CurrentCulture
null
,它在您的工作站上似乎有
表示十进制分隔符,
表示第一组:

   "123.45"    -> 12345m   - note, that group separator(s) is/are removed
   "1.2.3.4.5" -> 12345m
   "123,45"    -> 123.45m  - while decimal is turned into decimal point  
如果要将
视为十进制分隔符(因此
“123.45”
将被解析为
123.45m
),可以指定
CultureInfo.InvariantCulture

   Console.Write("Enter number: ");

   decimal d;

   while (!Decimal.TryParse(Console.ReadLine(), 
                            NumberStyles.Any, 
                            CultureInfo.InvariantCulture, 
                            out d)) 
     Console.WriteLine("Invalid syntax. Please, try again."); 

你在哪个国家?您的区域性是否使用
作为十进制分隔符?正如@canton7所说,根据您使用的
区域性,
作为十进制分隔符
转换。ToDecimal
及其调用的实际方法
decimal.Parse
,将根据用户的区域设置使用线程的当前区域性进行解析。如果输入采用不同的区域性,解析将失败。如果不想使用当前区域性,请明确指定要使用的区域性。如果每次尝试使用区域设置感知函数而不传递
CultureInfo
参数,编译器都会发出警告。很可能编译器已经警告过您problem@PanagiotisKanavosFxCop有,但编译器本身没有。。。为什么不使用
Decimal.Parse
重载,它接受
IFormatProvider
,只需传入
CultureInfo.InvariantCulture
?这是执行此操作的正常方式。我的建议不正确,因为硬编码假设十进制分隔符可以是什么。@canton7在使用
decimal d=decimal.Parse(Console.ReadLine(),CultureInfo.InvariantCulture)之后“6,6”becames“66”。@Miamy和南非使用
作为两个分离器。我在回答一个不寻常的解析问题时发现了这一点。现在的(非官方)惯例是将空间用于千个分离器哦,它变得更好了!官方格式不常见,因此使用美国风格。windows10和Ubuntu都使用导致
   Console.Write("Enter number: ");

   decimal d;

   while (!Decimal.TryParse(Console.ReadLine(), 
                            NumberStyles.Any, 
                            CultureInfo.InvariantCulture, 
                            out d)) 
     Console.WriteLine("Invalid syntax. Please, try again.");