Как я могу отформатировать строку в поле фиксированной ширины в .Net?

Я пытаюсь отформатировать строку произвольной длины в поле фиксированной ширины для отображения.

Давайте в качестве примера возьмем ширину 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. Спасибо тем, кто помог.

6
задан B Pete 8 August 2011 в 14:26
поделиться