Как использовать Round с DataView RowFilter?

Я использую DataView.RowFilter для фильтрации DataView, и я хотел бы сравнить округленные двойные значения, а не полные двойные значения. Например, значения в столбце «Значение» являются двойными с большой точностью, тогда как значения, с которыми я сравниваю, имеют только 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? Если нет, какие идеи о том, как я мог бы достичь этого?


person mikehamer    schedule 10.11.2009    source источник


Ответы (2)


Это можно решить напрямую с помощью строк фильтра, посложнив с математикой.

Число, округленное до 2 dp, можно сравнить с неокругленным числом, используя тот факт, что разница будет в пределах 0,01 от 0.

т.е. 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
person SeeMoreGain    schedule 02.11.2012

Эй, меня это тоже интересует, но я думаю, что обнаружил, что это невозможно (по крайней мере, в текущем наборе функций 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, и вы отображаете только первые знаковые цифры (поэтому будет отображаться 1,23), а затем пытаетесь фильтровать, где значение = 1,23 не дает результатов. В идеале функция ОКРУГЛа позволила бы мне округлить значения строк до интересующих меня цифр, но я также не смог найти разумный способ сделать это.

Удачи, я дам вам знать, если я наткнусь на что-нибудь.

РЕДАКТИРОВАТЬ: На самом деле, после того, как я написал это, я подумал о менее дерзком способе сделать это. Один из способов, который работает и не совсем ужасен, состоит в том, чтобы умножить оба значения на 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.

person Adam    schedule 15.02.2010
comment
Спасибо за ваш ответ Адам. Жаль, что это нельзя сделать более элегантно, но ваша идея умножения на 10^x — это, по крайней мере, способ сделать это. Int64 может быть более безопасным способом избежать переполнения. Я попробую вашу идею. - person mikehamer; 18.02.2010