为什么在下面的代码中,“ decimal.TryParse()”对于输入字符串“ -1”总是返回0?

Bij*_*dav 21 c# type-conversion

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

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

decimal.TryParse(validityStr, NumberStyles.AllowDecimalPoint,
                   CultureInfo.InvariantCulture, out validity);
Run Code Online (Sandbox Code Playgroud)

预期产量:

-1

实际输出:

0

Ste*_*odd 30

您忘了告诉TryParse前导符号可以

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

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

Run Code Online (Sandbox Code Playgroud)

  • @Alexander,您不需要指定`NumberStyles`。如果不使用TryParse的重载,则默认值包括AllowLeadingSign。由于NumberStyles是一个标记枚举,因此是可加的。DisallowLeadingSign`的值有点违反直觉。 (2认同)

小智 6

根据文档

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

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