Как использовать Round с DataView RowFilter? - PullRequest
1 голос
/ 10 ноября 2009

Я использую 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? Если нет, есть идеи о том, как мне этого добиться?

Ответы [ 2 ]

2 голосов
/ 02 ноября 2012

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

Число, округленное до 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
1 голос
/ 16 февраля 2010

Эй, меня это тоже интересует, но я думаю, что обнаружил, что это невозможно (по крайней мере, в текущем наборе функциональных возможностей 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 дает Нет результатов. В идеале функциональность ROUND позволила бы мне округлять значения строк до интересующих меня сигнатур, но я также не смог найти разумного способа сделать это.

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

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

...