【问题标题】:Why does "decimal.TryParse()" always return 0 for the input string "-1" in the below code?为什么“decimal.TryParse()”在下面的代码中总是为输入字符串“-1”返回 0?
【发布时间】:2019-09-28 05:12:56
【问题描述】:

下面的代码应该返回 -1 十进制值,但它返回 0。我做错了什么吗?

decimal validity = -1;
validityStr = "-1";

decimal.TryParse(validityStr, NumberStyles.AllowDecimalPoint,
                   CultureInfo.InvariantCulture, out validity);

预期输出:

-1

实际输出:

0

【问题讨论】:

  • 我假设该方法返回false?
  • 我认为您可能需要包含System.Globalization.NumberStyles.AllowLeadingSign。看看这个类似的问题:stackoverflow.com/questions/36277684/…
  • 调用Try 方法然后忽略它是否返回truefalse 是不好的做法。

标签: c# type-conversion


【解决方案1】:

你忘了告诉 TryParse 领先的标志是好的

decimal validity = -1;
var validityStr = "-1";

decimal.TryParse(validityStr, 
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign,
    CultureInfo.InvariantCulture, 
    out validity);

【讨论】:

  • 或者,您可以只使用NumberStyles.FloatNumberStyles.Number 或该枚举中已设置的复合值之一,这比必须单独指定所有Allow[blank] 行更简单。跨度>
  • 为什么AllowLeadingSign 不是默认行为?称其为想象力的失败,但老实说,我无法想象我想选择退出的情况。
  • @Alexander 您不需要指定NumberStyles。如果不使用TryParse 的重载,则默认包括AllowLeadingSign。因为NumberStyles 是一个标志枚举,所以它是加法的。 DisallowLeadingSign 值有点违反直觉。
  • 是的,事实上你可以只使用decimal.TryParse(validityStr, out validity);,甚至不用NumberStylesCultureInfo。这在绝大多数情况下都有效,但如果您要将项目本地化到具有不同数字格式的地方,则可能需要更具体。
  • @Alexander 以另一种方式回答您的第一条评论,NumberStyles.AllowLeadingSign is 如果您指定 NumberStyles.Any,则为“默认”(包含/启用),@ 987654336@、NumberStyles.IntegerNumberStyles.Number。如果您不使用这些复合值之一,而是使用NumberStyles.Allow* 值,如问题中所示,您实际上是在说“我将准确地选择我想要的”,所以准备好必须明确包括您想要的每个值。也就是说,当您选择退出默认值时,您不会获得默认值
【解决方案2】:

根据documentation

当此方法返回时,如果转换成功,则包含与 s 中包含的数值等效的 Decimal 数字,或 如果转换失败则为零。如果 s 参数为 null 或 Empty、不是有效格式的数字或表示小于 MinValue 或大于 MaxValue 的数字,则转换失败。这个参数是通过uininitialized传递的;结果中最初提供的任何值都会被覆盖。

由于转换失败,有效性变为0。为确保转换有效,您应该添加NumberStyles.AllowLeadingSign

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多