【问题标题】:How do I use Round with DataView RowFilter?如何将 Round 与 DataView RowFilter 一起使用?
【发布时间】:2009-11-10 12:18:58
【问题描述】:

我正在使用 DataView.RowFilter 过滤 DataView,我想比较舍入的双精度值而不是完整的双精度值。 例如,Value 列中的值是具有很高精度的双精度值,而我要比较的值只有 2 个小数位。

dataView.RowFilter = "Value IN (1.76, 1.92, 2.44)"  

不起作用。我想做类似的事情:

dataView.RowFilter = "Round(Value, 2) IN (1.76, 1.92, 2.44)"  

但这不起作用(Round() 无法识别)

这甚至可以使用 RowFilter 实现吗?如果没有,关于我如何实现这一目标的任何想法?

【问题讨论】:

    标签: asp.net dataview rounding


    【解决方案1】:

    这可以通过复杂的数学运算直接使用过滤器字符串来解决。

    四舍五入到 2 dp 的数字可以与未四舍五入的数字进行比较,因为差异将在 0 的 .01 以内

    1.23 将接近 1.23456 并接近 1.229876,因此:

    1.23 - 1.23456 < 0.01 AND
    1.23 - 1.23456 > -0.01
    
    1.23 - 1.229876 < 0.01 AND
    1.23 - 1.229876 > -0.01
    

    所以你的过滤字符串应该是:

    fieldName - value < 0.01 AND fieldName - value > -0.01
    

    【讨论】:

      【解决方案2】:

      嘿,我也对此感兴趣,但我认为我发现这是不可能的(至少在当前的 ASP Net 功能集中)。我发现的最有用的 RowFilter 资源在这里:http://www.csharp-examples.net/dataview-rowfilter/

      在该站点中,最有用的花絮是您可以进行 SUM、COUNT、MIN、MAX、AVG(平均)、STDEV(统计标准差)和 VAR;以及 CONVERT、LEN、ISNULL、IIF、TRIM、SUBSTRING。

      我的过滤器问题是,当您的基础值为 1.23456 时,您只显示第一个 sig 数字(因此它会显示 1.23),然后尝试过滤值 = 1.23 给出的位置没结果。理想情况下,ROUND 功能将允许我将行值四舍五入到我感兴趣的 sig-digs,但我也无法找到实现此目的的合理方法。

      祝你好运,如果我遇到任何事情,我会告诉你的。

      编辑:实际上,在我写完这篇文章后,我想到了一种不那么笨拙的方法。一种可行但并不完全糟糕的方法是将两个值乘以 10^x,然后转换为整数。示例代码如下:

      int mult = Convert.ToInt32(Math.Pow(10.0, _defaultDecimalSignificantDigits)); //in your example 2
                  dv.RowFilter = String.Format("CONVERT({0}*{3},System.Int32){1}CONVERT({2}*{3},System.Int32)", name, expression, value, mult); //where "name" is your column name, "expression" is =, <>, etc, and "value" is the entered row filter value
      

      值不会在显示中相乘,仅在过滤器逻辑中。因此,如果您的分数是 14.998,则将您的过滤器乘以 1000(将您的过滤器和值设为 14,998)。

      这显然取决于您要舍入多少小数位,但在您的 2 舍入示例中,您只需将两者乘以 100。具有足够大的数字和/或足够的小数位舍入,你也可能溢出 Int32 边界,而 Int64 可能是必要的。

      【讨论】:

      • 感谢您的回答亚当。遗憾的是它不能做得更优雅,但你乘以 10^x 的想法至少是一种方法。 Int64 可能是一种更安全的避免溢出的方法。我会试试你的想法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      相关资源
      最近更新 更多