Перейти к содержанию

Scripts: различия между версиями

Материал из Химсофт Вики
 
(не показано 45 промежуточных версий этого же участника)
Строка 8: Строка 8:


==GetOrDash()==
==GetOrDash()==
Функция <code>GetOrDash()</code> - предназначена для обработки пустых значений (<code>NULL</code>, пустые строки, пробелы) в ячейках отчета.


Она гарантирует, что вместо пустого места в таблице всегда будет отображаться визуальный маркер <code>-</code> (''дефис''), что улучшает читаемость документа.
<syntaxhighlight lang="vb">
Public Function GetOrDash(field As Object) As String
Public Function GetOrDash(field As Object) As String
If field Is Nothing OrElse IsDBNull(field) OrElse String.IsNullOrEmpty(field.ToString().Trim()) Then
If field Is Nothing OrElse IsDBNull(field) OrElse String.IsNullOrEmpty(field.ToString().Trim()) Then
Строка 16: Строка 20:
Return field.ToString()
Return field.ToString()
End Function
End Function
</syntaxhighlight>
===Входные параметры===
*<code>field</code> (''Object'') - данные из поля набора данных (принимает любой тип данных, так как параметр объявлен как <code>Object</code>).
===Выходные данные===
* <code>String</code> - строковое представление данных, если поле содержит значимую информацию;
* <code>-</code> (''дефис'') - если входной параметр:
**равен <code>Nothing</code> (не инициализирован);
**равен <code>DBNull.Value</code> (пустое значение из базы данных);
**является пустой строкой <code>""</code>;
**содержит только пробелы (метод <code>.Trim()</code>).
==GetOr()==
<syntaxhighlight lang="vb">
Public Function GetOr(field As Object,
Optional swap As String = "",
Optional pref As String = "",
Optional suf As String = "") As String
   
If field Is Nothing OrElse IsDBNull(field) OrElse String.IsNullOrWhiteSpace(field.ToString()) Then
Return swap
End If
   
Return pref & field.ToString().Trim() & suf
End Function
</syntaxhighlight>
===Входные параметры===
*<code>field</code> (''Object'') - проверяемое поле (может быть числом, строкой или объектом базы данных);
*<code>swap</code> (''String'', необязательно) - значение «подмены», которое вернется, если поле пустое; по умолчанию — пустая строка;
*<code>pref</code> (''String'', необязательно) - префикс, который добавится перед значением;
*<code>suf</code> (''String'', необязательно) - суффикс, который добавится после значения.
===Выходные данные===
*<code>String</code> - отформатированная строка с префиксом и суффиксом, либо значение <code>swap</code>;
===Алгоритм===
*проверка на пустоту - функция проверяет объект <code>field</code> на три условия: равен ли он <code>Nothing</code>, является ли он <code>DBNull</code> (пустота из базы данных) или состоит ли он только из пробелов;
*обработка пустого значения - если хотя бы одно условие истинно, возвращается значение параметра <code>swap</code>;
*форматирование - если поле содержит данные, функция обрезает лишние пробелы по краям (<code>Trim</code>), добавляет к нему заданные префикс (<code>pref</code>) и суффикс (<code>suf</code>) и возвращает результат.


==ConcatFields()==
==ConcatFields()==
Строка 60: Строка 106:
*<code>If list.Count = 0 Then Return "-"</code> - если после проверки всех элементов список пуст (все было null или пробелы), возвращается дефис;
*<code>If list.Count = 0 Then Return "-"</code> - если после проверки всех элементов список пуст (все было null или пробелы), возвращается дефис;
*<code>Return String.Join(separator, list.ToArray())</code> - все накопленные в списке элементы склеиваются в одну строку через указанный разделитель.
*<code>Return String.Join(separator, list.ToArray())</code> - все накопленные в списке элементы склеиваются в одну строку через указанный разделитель.
==GetExperience()==
Функция <code>GetExperience()</code> рассчитывает и форматирует строку о стаже работы сотрудника на основе даты получения диплома.
Она выводит количество лет с правильным суффиксом (через вспомогательную функцию <code>YearsWithSuffix</code>) и указывает временной интервал от даты диплома до сегодняшнего дня.
<syntaxhighlight lang="vb">
Public Function GetExperience(diplomDate As Object) As String
If IsDBNull(diplomDate) OrElse diplomDate Is Nothing Then
Return "-"
End If
   
Return YearsWithSuffix(diplomDate) & vbLF & Format(diplomDate, "dd.MM.yyyy") & " - по текущую дату"
End Function
</syntaxhighlight>
===Входные параметры===
*<code>diplomDate</code> (''Object'') - дата выдачи диплома.
===Выходные данные===
*<code>String</code>
**<code>-</code> - если дата не указана;
**многострочный текст, если дата есть; например:
::{| style="border-collapse: collapse;"
|
<syntaxhighlight>
5 лет
15.05.2018 - по текущую дату
</syntaxhighlight>
|}
===Алгоритм===
*проверка на пустоту - является ли входное значение пустым (<code>IsDBNull</code>) или отсутствующим (<code>Nothing</code>); если данных нет, возвращается прочерк;
*расчет лет - вызывается внешняя функция <code>YearsWithSuffix(diplomDate)</code>, которая вычисляет разницу между текущей датой и датой диплома, добавив правильное окончание (<code>год</code> / <code>года</code> / <code>лет</code>);
*форматирование даты - исходная дата преобразуется в стандартный формат <code>дд.мм.гггг.</code>;
*сборка результата - все части склеиваются в одну строку, символ <code>vbLF</code> переносит информацию о датах на новую строку.


==YearsWithSuffix()==
==YearsWithSuffix()==
Строка 105: Строка 188:
*возврат итоговой склеенной строки.
*возврат итоговой склеенной строки.


==FormatAsInitialsSurname()==
==GetNorms()==
 
<syntaxhighlight lang="vb">
Public Function GetNorms(lowLimit As Double, upLimit As Double) As String
If upLimit <> 0 Then
Return "не менее " & lowLimit & vbLF & "не более " & upLimit
End If
If lowLimit <> 0 Then
Return "не менее " & lowLimit
End If
   
Return ""
End Function
</syntaxhighlight>
 
===Входные параметры===
*<code>lowLimit</code> (''Double'') - нижняя граница нормы;
*<code>upLimit</code> (''Double'') - верхняя граница нормы.
 
===Выходные данные===
*<code>String</code> текстовое описание диапазона; возвращает пустую строку, если оба параметра равны нулю.


Функция преобразует полное имя (например, "Иванов Иван Иванович") в формат «Инициалы Фамилия» (И.И. Иванов). Она корректно обрабатывает лишние пробелы и работает как с именами из двух слов, так и из трёх.
===Алгоритм===
*проверка верхней границы - если <code>upLimit</code> не равен <code>0</code>, функция возвращает строку с обоими пределами (<code>не менее X, не более Y</code>), разделяя их переносом строки (<code>vbLF</code>);
*проверка нижней границы - если верхний предел равен <code>0</code>, но <code>lowLimit</code> не равен <code>0</code>, возвращается только нижний порог (<code>не менее X</code>);
*значение по умолчанию - если оба параметра равны <code>0</code>, функция возвращает пустую строку.


==NormProcessing()==
<syntaxhighlight lang="vb">
<syntaxhighlight lang="vb">
Public Function FormatAsInitialsSurname(fullName As String) As String
Function NormProcessing(ByVal min  As String, ByVal max As String) As String
Dim trimmedName As String = fullName.Trim()
Dim result As String = ""
Dim nameParts() As String = trimmedName.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
Dim hasMin As Boolean = Not String.IsNullOrEmpty(min) AndAlso min <> "0"
Dim hasMax As Boolean = Not String.IsNullOrEmpty(max) AndAlso max <> "0"
If hasMin And hasMax Then
result = min & "-" + max
Else If hasMin Then
result = "" & min
Else If hasMax Then
result = "≤" & max
Else
result = "-"
End If
Return result
End Function
</syntaxhighlight>


If nameParts.Length < 2 Then
===Входные параметры===
Return fullName
*<code>min</code> (''String'') - строковое значение нижней границы;
End If
*<code>max</code> (''String'') - строковое значение верхней границы.
 
===Выходные данные===
*<code>String</code> - форматированная строка диапазона, либо символ прочерка (<code>-</code>).
 
===Алгоритм===
*проверка наличия данных - определяются два флага (<code>hasMin</code> и <code>hasMax</code>); значение считается валидным, если оно не пустое и не равно строке <code>0</code>;
*выбор формата:
**если есть оба значения - возвращается диапазон через дефис (<code>min-max</code>);
**если есть только <code>min</code> - возвращается значение с символом «больше или равно» (<code>≥min</code>);
**если есть только max - возвращается значение с символом «меньше или равно» (<code>≤max</code>);
*значение по умолчанию - если оба входа пустые или равны <code>0</code>, возвращается дефис (<code>-</code>).
 
==RemoveTagsSimple()==
<syntaxhighlight lang="vb">
Function RemoveTagsSimple(ByVal input As String) As String
Dim tags() As String = {"<span>", "</span>", "<sub>", "</sub>", "<sup>", "</sup>"}
Dim txt As String = input
   
For Each tag As String In tags
txt = Replace(txt, tag, "", , , CompareMethod.Text)
Next
   
Return txt
End Function
</syntaxhighlight>
 
===Входные параметры===
*<code>input</code> (''String'') - исходная строка, содержащая HTML-подобные теги.
 
===Выходные данные===
*<code>String</code> - очищенный текст без специфических тегов.
 
===Алгоритм===
*определение списка - создается массив <code>tags</code>, содержащий конкретные строковые теги - <code><nowiki><span></nowiki></code>, <code><nowiki><sub></nowiki></code>, <code><nowiki><sup></nowiki></code> (открывающие и закрывающие);
*циклическая замена - функция перебирает каждый тег из списка и удаляет его из строки, заменяя на пустую строку;
*игнорирование регистра - используется метод <code>CompareMethod.Text</code>, что позволяет удалять теги независимо от того, написаны они заглавными или строчными буквами (например, удалит и <code><nowiki><span></nowiki></code>, и <code><nowiki><SPAN></nowiki></code>).
 
==FormatFio()==
 
<syntaxhighlight lang="vb">
Function FormatFio(surname As String, name As String, patronymic As String, mode As Integer) As String
Dim f = Trim(surname)
Dim i = Trim(name)
Dim o = Trim(patronymic)
   
Dim i_init = ""
Dim o_init = ""
If Len(i) > 0 Then i_init = Left(i, 1) & "."
If Len(o) > 0 Then o_init = Left(o, 1) & "."
Dim result = ""
Select Case mode
Case 0 ' Фамилия Имя Отчество
result = Trim(f & " " & i & " " & o)
Case 1 ' Фамилия И.О.
result = Trim(f & " " & i_init & o_init)
Case 2 ' И.О. Фамилия
result = Trim(i_init & o_init & " " & f)
End Select
 
Return GetOrDash(result)
End Function
</syntaxhighlight>
 
===Входные параметры===
*<code>surname</code> (''String'') - фамилия,
*<code>name</code> (''String'') - имя,
*<code>patronymic</code> (''String'') - отчество;
*<code>mode</code> (''Integer'') - режим форматирования (0, 1 или 2).
 
===Выходные данные===
*<code>String</code> - ФИО в выбранном формате; если результат пуст, вызывается внешняя функция <code>GetOrDash</code> (возвращает прочерк).
 
===Алгоритм===
*очистка - удаляются лишние пробелы из всех входящих строк (<code>Trim</code>);
*подготовка инициалов - для имени и отчества берутся первые буквы с точкой (i., o.), если соответствующие строки не пустые;
*Выбор формата (по mode):
**<code>0</code> - полное ФИО через пробел (Фамилия Имя Отчество);
**<code>1</code> - фамилия и инициалы слитно (Фамилия И.О.);
**<code>2</code> - инициалы и фамилия через пробел (И.О. Фамилия);
*финальная обработка - результат обрезается от лишних крайних пробелов и передается в <code>GetOrDash</code>.
 
==CollapseNumbers()==
Функция <code>CollapseNumbers()</code> свертывает массив чисел в компактную строку, заменяя последовательные числовые ряды диапазонами.
 
<syntaxhighlight lang="vb">
Public Function CollapseNumbers(inputNums As Object()) As String
If inputNums Is Nothing OrElse inputNums.Length = 0 Then Return ""
 
Dim nums(inputNums.Length - 1) As Integer
For i As Integer = 0 To inputNums.Length - 1
nums(i) = CInt(inputNums(i))
Next
Array.Sort(nums)
Dim result As String = ""
Dim index As Integer = 0
While index < nums.Length
Dim startNum As Integer = nums(index)
Dim endNum As Integer = startNum
 
While index + 1 < nums.Length AndAlso nums(index + 1) = nums(index) + 1
index += 1
endNum = nums(index)
End While
 
Dim currentStr As String = ""
 
If endNum - startNum = 0 Then
currentStr = startNum.ToString()
ElseIf endNum - startNum = 1 Then
currentStr = startNum.ToString() & ", " & endNum.ToString()
Else
currentStr = startNum.ToString() & "-" & endNum.ToString()
End If


Dim surname As String = nameParts(0)
If result = "" Then
Dim firstNameInitial As Char = nameParts(1)(0)
result = currentStr
Dim middleNameInitial As Char? = Nothing
Else
If nameParts.Length >= 3 Then
result &= ", " & currentStr
middleNameInitial = nameParts(2)(0)
End If
End If


Dim result As String = $"{firstNameInitial}."
index += 1
If middleNameInitial.HasValue Then
End While
result &= $"{middleNameInitial}."
End If
result &= $" {surname}"


Return result
Return result
Строка 136: Строка 374:


===Входные параметры===
===Входные параметры===
*<code>fullName</code> (''String'') - исходная строка, содержащая полные ФИО (ожидается формат «Фамилия Имя» или «Фамилия Имя Отчество»).
*<code>inputNums</code> (''Object()'') - массив объектов (чисел), которые нужно сгруппировать.
 
===Выходные данные===
*<code>String</code> - строка с перечисленными числами, где последовательные ряды заменены на диапазоны (например, <code>1, 2, 3, 5</code> превратится в <code>1-3, 5</code>).
 
===Алгоритм===
*подготовка - входные объекты преобразуются в массив целых чисел (Integer) и сортируются по возрастанию;
*поиск последовательностей - цикл проходит по массиву, определяя блоки идущих подряд чисел (где каждое следующее больше предыдущего на 1);
*форматирование группы:
**если число одиночное - записывается просто число;
**если в ряду два числа - записываются через запятую (<code>1, 2</code>);
**если в ряду три и более чисел - записываются через дефис как диапазон (<code>1-3</code>);
*сборка - все обработанные группы объединяются в одну строку через запятую с пробелом.
 
==AddIndents()==
Добавление абзацев (на перспективу).
 
<syntaxhighlight lang="vb">
Public Function AddIndents(ByVal text As String) As String
 
    If String.IsNullOrEmpty(text) Then Return ""
 
    Dim indentedText As String = text.Replace(vbCrLf, vbLf & "    ")
   
    Return "    " & indentedText
 
End Function
</syntaxhighlight>
 
===Входные параметры===
*<code>text</code> (''String'') - исходный многострочный текст.


===Выходные данные===
===Выходные данные===
*<code>String</code> - строка в формате И.О. Фамилия; если во входной строке меньше двух слов, функция вернет исходный текст без изменений.
*<code>String</code> - текст, в котором каждая строка начинается с отступа (4 пробела).


===Алгоритм===
===Алгоритм===
*<code>trimmedName</code> - удаляет случайные пробелы в начале и конце строки;
*проверка на пустоту - если входящая строка пустая или <code>Nothing</code>, возвращается пустая строка;
*строка разбивается на массив <code>nameParts</code>; используется <code>RemoveEmptyEntries</code>, чтобы лишние пробелы между словами не создавали пустых элементов;
*обработка переносов - функция находит все стандартные символы переноса строки (<code>vbLf</code>) и заменяет их на перенос, за которым сразу следуют 4 пробела; это создает отступы для всех строк, кроме первой;
*если в массиве меньше 2 слов (нет либо фамилии, либо имени), функция сразу прекращает работу и возвращает входную строку;
*обработка первой строки - в начало всей полученной строки принудительно добавляются 4 пробела, чтобы первая строка также имела отступ.
*первое слово записывается как фамилия (<code>surname</code>);
*берется первый символ второго слова — инициал имени (<code>firstNameInitial</code>);
*если есть третье слово, берется его первый символ — инициал отчества (<code>middleNameInitial</code>);
*записывается инициал имени с точкой;
*если отчество существует, к строке добавляется его инициал с точкой;
конце через пробел добавляется фамилия;
*функция возвращает итоговую строку.

Текущая версия от 10:01, 23 марта 2026

Общие сведения

Раздел Scripts предназначен для добавления программной логики непосредственно в файл макета отчета.

Это позволяет отчету быть самодостаточным: код из раздела выполняется в процессе формирования отчета.

Внутри раздела можно создавать собственные вспомогательные функции для выполнения сложных вычислений прямо «на лету».

GetOrDash()

Функция GetOrDash() - предназначена для обработки пустых значений (NULL, пустые строки, пробелы) в ячейках отчета.

Она гарантирует, что вместо пустого места в таблице всегда будет отображаться визуальный маркер - (дефис), что улучшает читаемость документа.

Public Function GetOrDash(field As Object) As String
	If field Is Nothing OrElse IsDBNull(field) OrElse String.IsNullOrEmpty(field.ToString().Trim()) Then
		Return "-"
	End If
    
	Return field.ToString()
End Function

Входные параметры

  • field (Object) - данные из поля набора данных (принимает любой тип данных, так как параметр объявлен как Object).

Выходные данные

  • String - строковое представление данных, если поле содержит значимую информацию;
  • - (дефис) - если входной параметр:
    • равен Nothing (не инициализирован);
    • равен DBNull.Value (пустое значение из базы данных);
    • является пустой строкой "";
    • содержит только пробелы (метод .Trim()).

GetOr()

Public Function GetOr(field As Object, 
	Optional swap As String = "", 
	Optional pref As String = "", 
	Optional suf As String = "") As String
    
	If field Is Nothing OrElse IsDBNull(field) OrElse String.IsNullOrWhiteSpace(field.ToString()) Then
		Return swap
	End If
    
	Return pref & field.ToString().Trim() & suf
End Function

Входные параметры

  • field (Object) - проверяемое поле (может быть числом, строкой или объектом базы данных);
  • swap (String, необязательно) - значение «подмены», которое вернется, если поле пустое; по умолчанию — пустая строка;
  • pref (String, необязательно) - префикс, который добавится перед значением;
  • suf (String, необязательно) - суффикс, который добавится после значения.

Выходные данные

  • String - отформатированная строка с префиксом и суффиксом, либо значение swap;

Алгоритм

  • проверка на пустоту - функция проверяет объект field на три условия: равен ли он Nothing, является ли он DBNull (пустота из базы данных) или состоит ли он только из пробелов;
  • обработка пустого значения - если хотя бы одно условие истинно, возвращается значение параметра swap;
  • форматирование - если поле содержит данные, функция обрезает лишние пробелы по краям (Trim), добавляет к нему заданные префикс (pref) и суффикс (suf) и возвращает результат.

ConcatFields()

Функция ConcatFields() - предназначена для объединения нескольких текстовых значений в одну строку с использованием заданного разделителя.

Public Function ConcatFields(separator As String, ParamArray fields() As Object) As String
	If fields Is Nothing Then Return "-"
    
	Dim list As New System.Collections.Generic.List(Of String)
    
	For Each f As Object In fields
		If f Is Nothing Then Continue For
		Dim elem As String = f.ToString().Trim()
		If String.IsNullOrEmpty(elem) Then Continue For
		list.Add(elem)
	Next
    
	If list.Count = 0 Then
		Return "-"
	Else
		Return String.Join(separator, list.ToArray())
	End If
End Function

Входные параметры

  • separator (String) - символ или текст, который будет стоять между элементами (например - запятая, или пробел, или перенос на следующую строку);
  • ParamArray fields() (Object) - список аргументов любого количества, перечисляется через запятую (также можно передать массив).

Выходные данные

  • String - одна строка из объединенных элементов.
  • - (дефис) - если данных нет.

Алгоритм

  • If fields Is Nothing Then Return "-" - если массив аргументов вообще не передан, функция сразу возвращает дефис;
  • Dim list As New System.Collections.Generic.List(Of String) - создается временный список для хранения "чистых" строковых элементов;
  • For Each f As Object In fields - цикл по каждому полученному на входе значению;
  • If f Is Nothing Then Continue For - если текущий элемент пуст (null), он пропускается;
  • Dim elem As String = f.ToString().Trim() - значение переводится в строковый элемент и очищается от лишних пробелов по краям;
  • If String.IsNullOrEmpty(elem) Then Continue For - если после удаления пробелов строковый элемент оказался пустым, он пропускается;
  • list.Add(elem) - корректный строковый элемент добавляется в итоговый список;
  • If list.Count = 0 Then Return "-" - если после проверки всех элементов список пуст (все было null или пробелы), возвращается дефис;
  • Return String.Join(separator, list.ToArray()) - все накопленные в списке элементы склеиваются в одну строку через указанный разделитель.

GetExperience()

Функция GetExperience() рассчитывает и форматирует строку о стаже работы сотрудника на основе даты получения диплома.

Она выводит количество лет с правильным суффиксом (через вспомогательную функцию YearsWithSuffix) и указывает временной интервал от даты диплома до сегодняшнего дня.

Public Function GetExperience(diplomDate As Object) As String
	If IsDBNull(diplomDate) OrElse diplomDate Is Nothing Then
		Return "-"
	End If
    
	Return YearsWithSuffix(diplomDate) & vbLF & Format(diplomDate, "dd.MM.yyyy") & " - по текущую дату"
End Function

Входные параметры

  • diplomDate (Object) - дата выдачи диплома.

Выходные данные

  • String
    • - - если дата не указана;
    • многострочный текст, если дата есть; например:
5 лет
15.05.2018 - по текущую дату

Алгоритм

  • проверка на пустоту - является ли входное значение пустым (IsDBNull) или отсутствующим (Nothing); если данных нет, возвращается прочерк;
  • расчет лет - вызывается внешняя функция YearsWithSuffix(diplomDate), которая вычисляет разницу между текущей датой и датой диплома, добавив правильное окончание (год / года / лет);
  • форматирование даты - исходная дата преобразуется в стандартный формат дд.мм.гггг.;
  • сборка результата - все части склеиваются в одну строку, символ vbLF переносит информацию о датах на новую строку.

YearsWithSuffix()

Функция YearsWithSuffix() - предназначена для формирования строки, содержащей количество лет и правильное грамматическое окончание существительного «год» (год, года, лет) на основе разницы между переданной датой и текущим моментом.

Public Function YearsWithSuffix(inputDate As Date) As String
	Dim yearsDiff As Long = DateDiff(DateInterval.Year, inputDate, Now())
	Dim resultDate As Long = yearsDiff
	Dim resultString As String = yearsDiff.ToString()
	
	If (resultDate > 20) Then
		resultDate = resultDate Mod 10
	End If
	
	Select Case resultDate
		Case 1
			resultString &= $" год"
		Case 2 To 4
			resultString &= $" года"
		Case Else
			resultString &= $" лет"
	End Select
	
	Return resultString
End Function

Входные параметры

  • inputDate (Date) - дата, от которой ведется отсчет.

Выходные данные

  • String - разница лет до текущего момента с текстом-суффиксом "21 год", "25 лет", "34 года".

Алгоритм

  • вычисляется полное количество лет между inputDate и текущей датой Now() с помощью функции DateDiff;
  • resultDate - техническая переменная для определения логики окончания;
  • resultString - строковое представление числа лет;
  • обработка исключений (20+ лет) - если число больше 20, применяется операция Mod 10 (остаток от деления на 10), чтобы привести числа вроде 21, 22, 25 к виду 1, 2, 5 для подбора окончания;
  • Select Case - блок выбора окончания;
  • Case 1 - если число (или его остаток) равно 1, добавляется слово год;
  • Case 2 To 4 - если число (или его остаток) в диапазоне от 2 до 4 включительно, добавляется слово года;
  • Case Else - в остальных случаях (для 0, 5–19 и специфических остатков) добавляется слово лет;
  • возврат итоговой склеенной строки.

GetNorms()

Public Function GetNorms(lowLimit As Double, upLimit As Double) As String
	If upLimit <> 0 Then
		Return "не менее " & lowLimit & vbLF & "не более " & upLimit
	End If
	
	If lowLimit <> 0 Then
		Return "не менее " & lowLimit
	End If
    
	Return ""
End Function

Входные параметры

  • lowLimit (Double) - нижняя граница нормы;
  • upLimit (Double) - верхняя граница нормы.

Выходные данные

  • String текстовое описание диапазона; возвращает пустую строку, если оба параметра равны нулю.

Алгоритм

  • проверка верхней границы - если upLimit не равен 0, функция возвращает строку с обоими пределами (не менее X, не более Y), разделяя их переносом строки (vbLF);
  • проверка нижней границы - если верхний предел равен 0, но lowLimit не равен 0, возвращается только нижний порог (не менее X);
  • значение по умолчанию - если оба параметра равны 0, функция возвращает пустую строку.

NormProcessing()

Function NormProcessing(ByVal min  As String, ByVal max As String) As String
	Dim result As String = ""
	
	Dim hasMin As Boolean = Not String.IsNullOrEmpty(min) AndAlso min <> "0"
	Dim hasMax As Boolean = Not String.IsNullOrEmpty(max) AndAlso max <> "0"
	
	If hasMin And hasMax Then
		result = min & "-" + max
	Else If hasMin Then
		result = "≥" & min
	Else If hasMax Then
		result = "≤" & max
	Else 
		result = "-"
	End If
	
	Return result
End Function

Входные параметры

  • min (String) - строковое значение нижней границы;
  • max (String) - строковое значение верхней границы.

Выходные данные

  • String - форматированная строка диапазона, либо символ прочерка (-).

Алгоритм

  • проверка наличия данных - определяются два флага (hasMin и hasMax); значение считается валидным, если оно не пустое и не равно строке 0;
  • выбор формата:
    • если есть оба значения - возвращается диапазон через дефис (min-max);
    • если есть только min - возвращается значение с символом «больше или равно» (≥min);
    • если есть только max - возвращается значение с символом «меньше или равно» (≤max);
  • значение по умолчанию - если оба входа пустые или равны 0, возвращается дефис (-).

RemoveTagsSimple()

Function RemoveTagsSimple(ByVal input As String) As String
	Dim tags() As String = {"<span>", "</span>", "<sub>", "</sub>", "<sup>", "</sup>"}
	Dim txt As String = input
    
	For Each tag As String In tags
		txt = Replace(txt, tag, "", , , CompareMethod.Text)
	Next
    
	Return txt
End Function

Входные параметры

  • input (String) - исходная строка, содержащая HTML-подобные теги.

Выходные данные

  • String - очищенный текст без специфических тегов.

Алгоритм

  • определение списка - создается массив tags, содержащий конкретные строковые теги - <span>, <sub>, <sup> (открывающие и закрывающие);
  • циклическая замена - функция перебирает каждый тег из списка и удаляет его из строки, заменяя на пустую строку;
  • игнорирование регистра - используется метод CompareMethod.Text, что позволяет удалять теги независимо от того, написаны они заглавными или строчными буквами (например, удалит и <span>, и <SPAN>).

FormatFio()

Function FormatFio(surname As String, name As String, patronymic As String, mode As Integer) As String
	Dim f = Trim(surname)
	Dim i = Trim(name)
	Dim o = Trim(patronymic)
    
	Dim i_init = ""
	Dim o_init = ""
	
	If Len(i) > 0 Then i_init = Left(i, 1) & "."
	If Len(o) > 0 Then o_init = Left(o, 1) & "."
	
	Dim result = ""
	
	Select Case mode
		Case 0 ' Фамилия Имя Отчество
			result = Trim(f & " " & i & " " & o) 
		Case 1 ' Фамилия И.О.
			result = Trim(f & " " & i_init & o_init) 
		Case 2 ' И.О. Фамилия
			result = Trim(i_init & o_init & " " & f)
	End Select

	Return GetOrDash(result)
End Function

Входные параметры

  • surname (String) - фамилия,
  • name (String) - имя,
  • patronymic (String) - отчество;
  • mode (Integer) - режим форматирования (0, 1 или 2).

Выходные данные

  • String - ФИО в выбранном формате; если результат пуст, вызывается внешняя функция GetOrDash (возвращает прочерк).

Алгоритм

  • очистка - удаляются лишние пробелы из всех входящих строк (Trim);
  • подготовка инициалов - для имени и отчества берутся первые буквы с точкой (i., o.), если соответствующие строки не пустые;
  • Выбор формата (по mode):
    • 0 - полное ФИО через пробел (Фамилия Имя Отчество);
    • 1 - фамилия и инициалы слитно (Фамилия И.О.);
    • 2 - инициалы и фамилия через пробел (И.О. Фамилия);
  • финальная обработка - результат обрезается от лишних крайних пробелов и передается в GetOrDash.

CollapseNumbers()

Функция CollapseNumbers() свертывает массив чисел в компактную строку, заменяя последовательные числовые ряды диапазонами.

Public Function CollapseNumbers(inputNums As Object()) As String
	If inputNums Is Nothing OrElse inputNums.Length = 0 Then Return ""

	Dim nums(inputNums.Length - 1) As Integer
	For i As Integer = 0 To inputNums.Length - 1
		nums(i) = CInt(inputNums(i))
	Next
	Array.Sort(nums)
	
	Dim result As String = ""
	Dim index As Integer = 0
	
	While index < nums.Length
		Dim startNum As Integer = nums(index)
		Dim endNum As Integer = startNum

		While index + 1 < nums.Length AndAlso nums(index + 1) = nums(index) + 1
			index += 1
			endNum = nums(index)
		End While

		Dim currentStr As String = ""

		If endNum - startNum = 0 Then
			currentStr = startNum.ToString()	
		ElseIf endNum - startNum = 1 Then
			currentStr = startNum.ToString() & ", " & endNum.ToString()
		Else
			currentStr = startNum.ToString() & "-" & endNum.ToString()
		End If

		If result = "" Then
			result = currentStr
		Else
			result &= ", " & currentStr
		End If

		index += 1
	End While

	Return result
End Function

Входные параметры

  • inputNums (Object()) - массив объектов (чисел), которые нужно сгруппировать.

Выходные данные

  • String - строка с перечисленными числами, где последовательные ряды заменены на диапазоны (например, 1, 2, 3, 5 превратится в 1-3, 5).

Алгоритм

  • подготовка - входные объекты преобразуются в массив целых чисел (Integer) и сортируются по возрастанию;
  • поиск последовательностей - цикл проходит по массиву, определяя блоки идущих подряд чисел (где каждое следующее больше предыдущего на 1);
  • форматирование группы:
    • если число одиночное - записывается просто число;
    • если в ряду два числа - записываются через запятую (1, 2);
    • если в ряду три и более чисел - записываются через дефис как диапазон (1-3);
  • сборка - все обработанные группы объединяются в одну строку через запятую с пробелом.

AddIndents()

Добавление абзацев (на перспективу).

Public Function AddIndents(ByVal text As String) As String

    If String.IsNullOrEmpty(text) Then Return ""

    Dim indentedText As String = text.Replace(vbCrLf, vbLf & "    ")
    
    Return "    " & indentedText

End Function

Входные параметры

  • text (String) - исходный многострочный текст.

Выходные данные

  • String - текст, в котором каждая строка начинается с отступа (4 пробела).

Алгоритм

  • проверка на пустоту - если входящая строка пустая или Nothing, возвращается пустая строка;
  • обработка переносов - функция находит все стандартные символы переноса строки (vbLf) и заменяет их на перенос, за которым сразу следуют 4 пробела; это создает отступы для всех строк, кроме первой;
  • обработка первой строки - в начало всей полученной строки принудительно добавляются 4 пробела, чтобы первая строка также имела отступ.