6

我找到了解决这个错误的方法,但现在我真的很好奇为什么会发生这种情况,想知道是否有其他人遇到过这个错误。

我的功能如下:

public void Blog_GetRating(int blogID, ref decimal rating, ref int voteCount)
{
    // Sql statements
    // Sql commands

    if (DataReader.Read())
    {
        // this line throws a 'Input string was not in a correct format.' error.
        rating = decimal.Parse(DataReader["Rating"].ToString());

        // this works absolutly fine?!
        decimal _rating = 0;
        decimal.TryParse(DataReader["Rating"].ToString(), out _rating);

        rating = _rating;
    }
}

以前有人见过吗?

更奇怪的是,如果我输入这个:

rating = decimal.Parse("4.0");

效果很好,4.0 是从我的 DataReader 中出来的。

正如我之前所说,TryParse 方法工作正常,所以它不会阻止我携带,但现在我真的很想看看是否有人对此有答案。

期待一些回复!

肖恩

编辑 - 已解决

decimal.Parse 方法运行良好,该函数第二次运行时(在循环中),未对帖子进行评级,因此数据读取器返回空值。在 SQL 中将 COALESCE 包裹在我的计算中可以很好地解决问题。因此,正如您所说,为什么 tryparse 方法没有抛出异常,只是将默认值 0 保留为 _rating。

4

5 回答 5

11

这对我来说一点也不奇怪。

Decimal.Parse()应该为错误的格式抛出异常。 Decimal.TryParse()不会抛出该异常,而是只返回 false。踢球者是您没有检查Decimal.TryParse(). 我会给你真正的好几率,Decimal.TryParse()对于导致异常的每个输入都返回 false Decimal.Parse(),而在其他任何地方都返回 true 。当Decimal.TryParse()返回 false 时,输出参数始终为“0”。

一个可能的警告是本地化。如果Decimal.Parse()抱怨看似正常的输入,您可以检查服务器上使用的数字格式(当前文化)是否使用逗号而不是小数来将系数与尾数分开。但是鉴于您的“4.0”测试运行良好,我怀疑这是问题所在。

最后,在从数据读取器进行这种转换时,您应该考虑数据读取器的源列类型。如果可能已经是小数。为什么将其转换为字符串只是为了将其转换回来?

于 2009-09-01T15:46:11.347 回答
2

你在说这个:

    // this works absolutly fine?!
    decimal _rating = 0;
    decimal.TryParse(DataReader["Rating"].ToString(), out _rating);

但是您实际上并没有检查 TryParse 的返回值。我猜你的 TryParse 实际上是失败的(返回 false),因为 decimal.Parse 和 decimal.TryParse 使用相同的“规则”进行解析,给定你正在使用的重载。

我怀疑两者都不像你想象的那样工作。两者都可能失败,但 TryParse 不会抛出。

于 2009-09-01T15:49:43.197 回答
1

sql 十进制列不会解析为可以转换为 Decimal 的字符串,因此 tryparse 将返回 false。尝试这样的事情:

 if (Convert.IsDBNull(reader["DecimalColumn"]))
     {
        decimalData = 0m;
     }
     else
     {
        decimalData = reader.GetDecimal(reader.GetOrdinal("DecimalColumn"));
     }
于 2012-06-01T15:56:27.587 回答
1

我今天面临同样的问题。尝试这个:

rating = decimal.Parse("4,0");

它会给你同样的错误。


这背后的原因是文化。在法国文化中,4.0 表示为 4,0,因此它会引发异常。

decimal.TryParse是文化不变的方法,因此它可以很好地工作。

于 2014-09-26T16:33:00.563 回答
0

将您的 TryParse 更改为此并重试:

if (!decimal.TryParse(DataReader["Rating"].ToString(), out _rating))
{
  throw new Exception("Input string was not in a correct format");
}

我敢打赌这确实会抛出......

于 2009-09-01T15:54:53.013 回答