Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “为什么?”;decimal.TryParse();始终为输入字符串“返回0”-1“;在下面的代码中?_C#_Type Conversion - Fatal编程技术网

C# “为什么?”;decimal.TryParse();始终为输入字符串“返回0”-1“;在下面的代码中?

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

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

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*
值,就像问题中所说的,您实际上是在说“我要准确地选择我想要的”,所以请准备好必须明确地包括您想要的每个值。也就是说,当您选择退出默认设置时,您不会得到默认设置。