Я пытаюсь отформатировать строку произвольной длины в поле фиксированной ширины для отображения.
Давайте в качестве примера возьмем ширину 20 и вызовем строку для форматирования s. Я добавляю отформатированную строку в StringBuilder с именем b.
Dim b As New System.Text.StringBuilder()
Dim s as New String
Если строка, которую я хочу отобразить, короче 20 символов, я могу сделать следующее:
b.Append(s.PadRight(20))
или
b.AppendFormat("{0,-20}", s)
Пока все хорошо. Но если строка длиннее 20 символов, я хочу, чтобы строка была усечена до 20 символов при добавлении. Приведенный выше код добавляет всю строку.
Я пробовал это:
b.Append(s.Substring(0,20).PadRight(20))
Но это вызывает исключение, если строка была короче 20 символов.
Итак, я получил:
b.Append(s.PadRight(20).Substring(0,20))
Кажется, это работает работа. PadRight предотвращает исключение, проверяя, что строка t имеет 20 символов, прежде чем будет выполнена подстрока.
Мне было интересно, есть ли альтернативный метод, который выглядел бы более элегантно и избегал бы заполнения строки, чтобы предотвратить возникновение исключения из подстроки. . Пропустил ли я функцию String.Format, которая может выполнить это за один шаг?
Отредактировано для добавления решения:
В итоге я получил следующий код:
Module Extensions
<Extension()> _
Function AppendFixed(ByVal b As StringBuilder, ByVal s As String, ByVal width As Integer) As StringBuilder
If s.Length >= width Then
b.Append(s, 0, width)
Else
b.Append(s)
b.Append(" ", width - s.Length)
End If
Return b
End Function
End Module
Здесь используется метод расширения для очистки синтаксиса, как было предложено Джоэлом и Мерлином,и использует перегрузки StringBulider Append, чтобы избежать создания новых строк, которые необходимо будет собирать сборщиком мусора, как предлагает supercat. Спасибо тем, кто помог.