代码之家  ›  专栏  ›  技术社区  ›  royse41

从DataReader解析小数

  •  6
  • royse41  · 技术社区  · 16 年前

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

    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");
    

    正如我之前所说,TryParse方法工作得很好,所以它并没有阻止我携带,但现在我真的很想知道是否有人对此有答案。

    期待一些回复!

    肖恩

    编辑-已解决

    小数。Parse方法工作正常,第二次运行该函数时(在循环中),一个帖子没有被评分,因此数据读取器返回了一个空值。用SQL将COALESCE包裹在我的计算中很好地解决了这个问题。因此,正如您所说,为什么tryparse方法没有抛出异常,只是保持默认值0到_rating。

    5 回复  |  直到 12 年前
        1
  •  11
  •   Joel Coehoorn    16 年前

    在我看来,这一点也不奇怪。

    Decimal.Parse() 对格式错误抛出异常。 Decimal.TryParse() . 我给你很大的机会 十进制的。TryParse() 对于每个导致异常的输入返回false 十进制的。解析() 十进制的。TryParse() 返回false,输出参数始终为“0”。

    一个可能的警告是本地化。如果 十进制的。解析() 如果您在抱怨看似正常的输入,您可以检查服务器上使用的数字格式(当前区域性)是否使用逗号而不是小数来分隔系数和尾数。但鉴于你的“4.0”测试运行良好,我怀疑这不是问题所在。

        2
  •  2
  •   Reed Copsey    16 年前

    你是这么说的:

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

    我怀疑两者都没有像你想象的那样奏效。两者都可能失败,但TryParse不会扔。

        3
  •  1
  •   TheEmirOfGroofunkistan    14 年前

    sql decimal列不会解析为可以转换为decimal的字符串,因此tryparse将返回false。试试这样的:

     if (Convert.IsDBNull(reader["DecimalColumn"]))
         {
            decimalData = 0m;
         }
         else
         {
            decimalData = reader.GetDecimal(reader.GetOrdinal("DecimalColumn"));
         }
    
        4
  •  1
  •   msrd0 Gordon Linoff    11 年前

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


    decimal.TryParse

        5
  •  0
  •   Dan Diplo    16 年前

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

    我打赌这确实会摔。..