Scripts: различия между версиями
Sidminik (обсуждение | вклад) |
Sidminik (обсуждение | вклад) |
||
| (не показано 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: | ||
*возврат итоговой склеенной строки. | *возврат итоговой склеенной строки. | ||
== | ==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"> | ||
Function NormProcessing(ByVal min As String, ByVal max As String) As String | |||
Dim | Dim result As String = "" | ||
Dim | |||
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 | ===Входные параметры=== | ||
*<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 | |||
If result = "" Then | |||
result = currentStr | |||
Else | |||
result &= ", " & currentStr | |||
End If | |||
index += 1 | |||
End While | |||
End | |||
Return result | Return result | ||
| Строка 136: | Строка 374: | ||
===Входные параметры=== | ===Входные параметры=== | ||
*<code> | *<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>Nothing</code>, возвращается пустая строка; | ||
*обработка переносов - функция находит все стандартные символы переноса строки (<code>vbLf</code>) и заменяет их на перенос, за которым сразу следуют 4 пробела; это создает отступы для всех строк, кроме первой; | |||
* | *обработка первой строки - в начало всей полученной строки принудительно добавляются 4 пробела, чтобы первая строка также имела отступ. | ||
*в | |||
Текущая версия от 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 пробела, чтобы первая строка также имела отступ.