C# “为什么?”;decimal.TryParse();始终为输入字符串“返回0”-1“;在下面的代码中?
下面的代码应该返回-1十进制值,但返回0。我做错什么了吗C# “为什么?”;decimal.TryParse();始终为输入字符串“返回0”-1“;在下面的代码中?,c#,type-conversion,C#,Type Conversion,下面的代码应该返回-1十进制值,但返回0。我做错什么了吗 decimal validity = -1; validityStr = "-1"; decimal.TryParse(validityStr, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out validity); 预期输出: -一, 实际输出: 0 你忘了告诉特里帕斯前导符号是OK decimal validit
decimal validity = -1;
validityStr = "-1";
decimal.TryParse(validityStr, NumberStyles.AllowDecimalPoint,
CultureInfo.InvariantCulture, out validity);
预期输出:
-一,
实际输出:
0
你忘了告诉特里帕斯前导符号是OK
decimal validity = -1;
var validityStr = "-1";
decimal.TryParse(validityStr,
NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign,
CultureInfo.InvariantCulture,
out validity);
根据:
此方法返回时,如果转换成功,则包含与s中包含的数值相等的十进制数;如果转换失败,则包含零。如果s参数为null或空、不是有效格式的数字或表示小于MinValue或大于MaxValue的数字,则转换失败。此参数被传递并初始化;结果中最初提供的任何值都将被覆盖
由于转换失败,有效性变为0。为了确保转换有效,您应该添加.allowReadingSign我假设该方法返回的是
false
?我认为您可能需要包含System.Globalization.NumberStyles.allowReadingSign
。看看这个类似的问题:调用Try
方法,然后忽略它是否返回true
或false
,这是一个糟糕的做法。或者,您可以只使用NumberStyles.Float
、NumberStyles.Number
或该枚举中已设置的组合值之一,比单独指定所有Allow[blank]
行更简单。为什么allowReadingSign
不是默认行为?可以说这是想象力的失败,但老实说,我无法想象在什么情况下我会选择退出。@Alexander你不需要指定一个numberstyle
。如果不使用此重载的TryParse
,默认值包括allowReadingSign
。由于numberstyle
是一个标志枚举,因此它是加法的。一个DisallowLeadingSign
值会有点违反直觉。是的,事实上,您可以只使用decimal.TryParse(validityStr,out validity)
甚至不用为数字样式
或文化信息
操心。这在绝大多数情况下都有效,但如果要将项目本地化到具有不同数字格式的位置,则可能需要更加具体。@Alexander要以另一种方式回答您的第一条评论,NumberStyles.allowReadingSign
是“默认值”(包括/启用)如果指定NumberStyles.Any
,NumberStyles.Float
,NumberStyles.Integer
,或NumberStyles.Number
。如果您不使用这些复合值中的一个,而是使用numberstyle.Allow*
值,就像问题中所说的,您实际上是在说“我要准确地选择我想要的”,所以请准备好必须明确地包括您想要的每个值。也就是说,当您选择退出默认设置时,您不会得到默认设置。