|
|
| (не показано 29 промежуточных версий этого же участника) |
| Строка 1: |
Строка 1: |
| ==Общие сведения== | | ==Перечень доступных библиотек, классов и функций== |
|
| |
|
| Функции, вынесенные в глобальную видимость через объект <code>Code</code>, позволяют централизованно управлять логикой форматирования данных.
| | {|class="wikitable" style="margin:auto; background-color: #fff;" |
| | |- style="background:#f8f9fa; font-weight:bold; text-align:center;" |
| | ! style="width:40%;" | Файл подключаемой библиотеки /<br>пространство имен (без приставки <code>.dll</code>) |
| | ! style="width:30%;" | Класс |
| | ! style="width:30%;" | Функция |
| | |- |
|
| |
|
| Это избавляет от необходимости дублировать код в каждом отдельном макете и обеспечивает единообразие расчетов во всех отчетах.
| | | rowspan="2" | <code>Chemsoft.Triteia.ReportClasses.dll</code> |
| | | <code>IdNameItemDto</code> |
| | | – |
| | |- |
| | | <code>DoubleIdNameItemDto</code> |
| | | – |
| | |- |
|
| |
|
| ==Rounding.RoundBase()== | | | rowspan="2" | <code>Chemsoft.Triteia.ReportFunctions.Maths.dll</code> |
| | | | <code>Rounding</code> |
| Предназначена для гибкого округления числовых значений.
| | | <code>RoundBase</code> |
| | | |- |
| В отличие от стандартных функций, она поддерживает работу с отрицательными разрядами и округление до значащих цифр.
| | | <code>RoundMode</code> |
| | | | – |
| ===Входные параметры===
| | |- |
| *<code>value</code> (''Double'') - исходное число для обработки;
| |
| *<code>digits</code> (''Object'')
| |
| **при <code>Mode = 1</code> - количество знаков после запятой (положительное) или до запятой (отрицательное);
| |
| **при <code>Mode = 0</code> - количество значащих цифр;
| |
| *<code>mode</code> (''Object'') - режим работы:
| |
| **<code>1</code> (''ToDecimalPlace'') - десятичное округление;
| |
| **<code>0</code> (''ToSignificantPlace'') - значащие цифры.
| |
| | |
| ===Выходные параметры===
| |
| *<code>String</code> - возвращает строковое представление числа.
| |
| | |
| ===Алгоритм===
| |
| Функция работает по методу <code>Away From Zero</code> (округление от нуля).
| |
| | |
| '''Режим 1''' (''десятичное округление''):
| |
| *вычисляется множитель;
| |
| *число умножается на множитель, округляется до целого и делится обратно;
| |
| *при положительном n результат форматируется с фиксированным количеством нулей после запятой.
| |
| | |
| '''Режим 0''' (''значащие цифры''):
| |
| *определяется порядок числа через десятичный логарифм;
| |
| *вычисляется масштабный коэффициент, чтобы оставить ровно <code>n</code> цифр;
| |
| *число масштабируется, округляется и возвращается в исходный порядок;
| |
| *результат преобразуется в компактную строку (удаляются лишние нули в конце).
| |
| | |
| ===Примеры использования внутри ячейки===
| |
|
| |
|
| {|class="wikitable" style="margin:auto; background-color: #fff; width:100%"
| | | rowspan="6" | <code>Chemsoft.Triteia.ReportFunctions.Cells.dll</code> |
| | | rowspan="3" | <code>Formatters</code> |
| | | <code>ClearTags</code> |
| |- | | |- |
| !Исходное значение
| | | <code>SetMarginByDots</code> |
| !Синтаксис в соответствии с формулой <code>=Code.Rounding.RoundBase(x, n, m)</code>
| |
| !Результат
| |
| |- | | |- |
| |style="text-align:right"|12345
| | | <code>CollapseNumbers</code> |
| |<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, 2, 1)</syntaxhighlight> | |
| |style="text-align:right"|12345,00
| |
| |- | | |- |
| |style="text-align:right"|12345.00 | | |
| |<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, 0, 1)</syntaxhighlight> | | | rowspan="3" | <code>Getters</code> |
| |style="text-align:right"|12345
| | | <code>FieldOr</code> |
| |- | | |- |
| |style="text-align:right"|12345.01
| | | <code>JoinFields</code> |
| |<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, -2, 1)</syntaxhighlight> | |
| |style="text-align:right"|12300
| |
| |- | | |- |
| |style="text-align:right"|555.55
| | | <code>DateOr</code> |
| |<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, 1, 0)</syntaxhighlight> | |
| |style="text-align:right"|600
| |
| |- | | |- |
| |}
| |
|
| |
|
| ===Примеры использования во вкладке <code>Scripts</code>=== | | | rowspan="2" | <code>Chemsoft.Triteia.ReportFunctions.Events.dll</code> |
| | | <code>AfterData</code> |
| | | <code>AlignCells</code> |
| | |- |
| | | <code>KeyPressValidate</code> |
| | | <code>BlockIfNotDigits</code> |
| | |- |
|
| |
|
| {|class="wikitable" style="margin:auto; background-color: #fff; width:100%"
| | | rowspan="3" | <code>Chemsoft.Triteia.ReportFunctions.Controls.dll</code> |
| | | <code>ListControlDataFiller</code> |
| | | <code>GetItemsArray</code> |
| |- | | |- |
| !Исходное значение
| | |
| !Синтаксис в соответствии с формулой <code>=Code.Rounding.RoundBase(x, n, m)</code>
| | | rowspan="2" | <code>CheckedListSynchronizer</code> |
| !Результат
| | | <code>HandleCheckboxChanged</code> |
| |- | | |- |
| |style="text-align:right"|12345
| | | <code>HandleItemCheck</code> |
| |<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, 2, 1)</syntaxhighlight> | |
| |style="text-align:right"|12345,00
| |
| |- | | |- |
| |style="text-align:right"|12345.00 | | |
| |<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, 0, 1)</syntaxhighlight> | | | rowspan="3" | <code>Chemsoft.Triteia.ReportFunctions.Signatures.dll</code> |
| |style="text-align:right"|12345 | | | rowspan="3" | <code>PersonNameFormatter</code> |
| | | <code>NameInit</code> |
| |- | | |- |
| |style="text-align:right"|12345.01
| | | <code>InitName</code> |
| |<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, -2, 1)</syntaxhighlight> | |
| |style="text-align:right"|12300
| |
| |-
| |
| |style="text-align:right"|555.55
| |
| |<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, 1, 0)</syntaxhighlight>
| |
| |style="text-align:right"|600
| |
| |- | | |- |
| | | <code>FullName</code> |
| |} | | |} |
|
| |
|
| ===Предварительный вариант на VB.NET=== | | ==Варианты подключения в основном классе отчета <code>ReportScript</code>== |
| <syntaxhighlight lang="vb"> | | |
| Public Function RoundBase(ByVal xValue As Double, ByVal nDigits As Integer, ByVal mMode As Integer) As String
| | ===Подключение пространства имен=== |
|
| | <syntaxhighlight lang="C#"> |
| If xValue = 0 Then Return "0"
| | using Chemsoft.Triteia.ReportFunctions.Signatures; |
|
| | </syntaxhighlight> |
| 'Проверка аргумента nDigits, является ли пустым, остутствующим в БД или пустой строкой
| | |
| Dim nDigitsFlag As Boolean = True
| | В таком случае для использования в выражении перед именем функции требуется через точку указывать имя класса: |
| If nDigits Is Nothing OrElse IsDBNull(nDigits) OrElse String.IsNullOrEmpty(nDigits.ToString().Trim()) Then
| | <syntaxhighlight lang="C#"> |
| nDigitsFlag = False
| | [PersonNameFormatter.FullName([Main.surname], [Main.name], [Main.patronimyc])] |
| End If
| |
|
| |
| 'Проверка аргумента mMode, является ли пустым, остутствующим в БД или пустой строкой
| |
| Dim mModeFlag As Boolean = True
| |
| If mMode Is Nothing OrElse IsDBNull(mMode) OrElse String.IsNullOrEmpty(mMode.ToString().Trim()) Then
| |
| mModeFlag = False
| |
| End If
| |
|
| |
| 'Если хотя бы один из параметров (nDigits или mMode) отсутствует, возвращается исходное число xValue
| |
| If (nDigitsFlag = False) Or (mModeFlag = False)
| |
| Return xValue
| |
| End If
| |
|
| |
| If mMode = 1 Then
| |
| ' Округление до n знаков после запятой
| |
| ' В отличие от стандартной функции Math.Round(value, digits, MidpointRounding.AwayFromZero)
| |
| ' может работать с отрицательными digits за счет сдвига
| |
|
| |
| ' Вычисление множителя
| |
| Dim factor As Double = Math.Pow(10, nDigits)
| |
|
| |
| ' Свдиг запятой на расстояние множителя, округление до целого, обратный сдвиг
| |
| ' Направление сдвига зависит от знака (+-) в nDigits
| |
| Dim result As Double = Math.Round(xValue * factor, 0, MidpointRounding.AwayFromZero) / factor
| |
|
| |
| ' Форматирование результата (либо до целого(0), либо по положительному nDigits)
| |
| Return result.ToString("F" & Math.Max(0, nDigits))
| |
| End If
| |
|
| |
| If mMode = 0 Then
| |
| ' Округление до n значащих цифр
| |
|
| |
| ' Определение порядка числа (до запятой)
| |
| Dim scale As Double = Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(xValue))) + 1 - nDigits)
| |
|
| |
| ' Свдиг запятой влево (уменьшение порядка числа), округление, сдвиг вправо (увеличение порядка числа)
| |
| Dim result As Double = Math.Round(xValue / scale, 0, MidpointRounding.AwayFromZero) * scale
| |
|
| |
| ' Форматирование результата в компактную строку (удаление лишних нулей, научная нотация)
| |
| Return result.ToString("G")
| |
| End If
| |
|
| |
| ' При некорректном значении режима mMode
| |
| Return ""
| |
|
| |
| End Function
| |
| </syntaxhighlight> | | </syntaxhighlight> |
|
| |
|
| ===Итоговый вариант на С#=== | | ===Подключение класса=== |
| <syntaxhighlight lang="csharp"> | | <syntaxhighlight lang="C#"> |
| public class Rounding
| | using static Chemsoft.Triteia.ReportFunctions.Signatures.PersonNameFormatter; |
| {
| | </syntaxhighlight> |
| public string RoundBase(double value, int digits, RoundMode mode)
| |
| {
| |
| if (value == 0)
| |
| return "0";
| |
|
| |
|
| double result;
| | В таком случае для использования в выражении требуется указывать только имя функции: |
| switch (mode)
| | <syntaxhighlight lang="C#"> |
| {
| | [FullName([Main.surname], [Main.name], [Main.patronimyc])] |
| case RoundMode.ToDecimalPlace:
| |
| double factor = Math.Pow(10, digits);
| |
| result = Math.Round(value * factor, 0, MidpointRounding.AwayFromZero) / factor;
| |
| return result.ToString("F" + Math.Max(0, digits));
| |
| case RoundMode.ToSignificantPlace:
| |
| double scale = Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(value))) + 1 - digits);
| |
| result = Math.Round(value / scale, 0, MidpointRounding.AwayFromZero) * scale;
| |
| return result.ToString("G");
| |
| default:
| |
| throw new ArgumentOutOfRangeException(nameof(mode), "Некорректный режим округления");
| |
| }
| |
| }
| |
|
| |
| public string RoundBase(double value, int digits, int mode) => RoundBase(value, digits, (RoundMode)mode);
| |
| }
| |
| </syntaxhighlight> | | </syntaxhighlight> |
| | |
| | <div style="background-color: #e7f3ff; border-left: 5px solid #2196f3; padding: 15px; margin: 10px 0;"> |
| | '''Примечание''' |
| | |
| | Даже если функция используется только в выражениях и не используется во вкладке кода, она все-равно должна быть обязательно подключена во вкладке кода одним из двух способов! |
| | </div> |
Перечень доступных библиотек, классов и функций
Файл подключаемой библиотеки / пространство имен (без приставки .dll)
|
Класс
|
Функция
|
Chemsoft.Triteia.ReportClasses.dll
|
IdNameItemDto
|
–
|
DoubleIdNameItemDto
|
–
|
Chemsoft.Triteia.ReportFunctions.Maths.dll
|
Rounding
|
RoundBase
|
RoundMode
|
–
|
Chemsoft.Triteia.ReportFunctions.Cells.dll
|
Formatters
|
ClearTags
|
SetMarginByDots
|
CollapseNumbers
|
Getters
|
FieldOr
|
JoinFields
|
DateOr
|
Chemsoft.Triteia.ReportFunctions.Events.dll
|
AfterData
|
AlignCells
|
KeyPressValidate
|
BlockIfNotDigits
|
Chemsoft.Triteia.ReportFunctions.Controls.dll
|
ListControlDataFiller
|
GetItemsArray
|
CheckedListSynchronizer
|
HandleCheckboxChanged
|
HandleItemCheck
|
Chemsoft.Triteia.ReportFunctions.Signatures.dll
|
PersonNameFormatter
|
NameInit
|
InitName
|
FullName
|
Варианты подключения в основном классе отчета ReportScript
Подключение пространства имен
using Chemsoft.Triteia.ReportFunctions.Signatures;
В таком случае для использования в выражении перед именем функции требуется через точку указывать имя класса:
[PersonNameFormatter.FullName([Main.surname], [Main.name], [Main.patronimyc])]
Подключение класса
using static Chemsoft.Triteia.ReportFunctions.Signatures.PersonNameFormatter;
В таком случае для использования в выражении требуется указывать только имя функции:
[FullName([Main.surname], [Main.name], [Main.patronimyc])]
Примечание
Даже если функция используется только в выражениях и не используется во вкладке кода, она все-равно должна быть обязательно подключена во вкладке кода одним из двух способов!