C# Convert.ToDecimal不';t转换输入十进制数
我是c#新手,尝试将输入转换为十进制和双精度。当我输入一个整数时,它可以正常工作,但当我输入一个十进制或双精度数字时,它会立即停止,并给出一条“Exception Unhandled”(异常未处理)错误消息 我的代码: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,它就会
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.");