.NET Формат строки с фиксированными пространствами

Предоставляет ли метод .NET String.Format размещение строки в фиксированной позиции в строке фиксированной длины.

"           String Goes Here"
"     String Goes Here      "
"String Goes Here           "

Как это делается с использованием .NET?

Изменить. Я пробовал формат /PadLeft/PadRight до смерти. Они не работают. Я не знаю почему. В итоге я написал свою собственную функцию, чтобы сделать это.

Изменить. Я допустил ошибку и использовал двоеточие вместо запятой в спецификаторе формата. Должно быть "{0,20}".

Спасибо за все превосходные и правильные ответы.

Ответ 1

Это даст вам именно те строки, которые вы просили:

string s = "String goes here";
string line1 = String.Format("{0,27}", s);
string line2 = String.Format("{0,-27}", String.Format("{0," + ((27 + s.Length) / 2).ToString() +  "}", s));
string line3 = String.Format("{0,-27}", s);

Ответ 2

Первое и последнее, по крайней мере, возможны с использованием следующего синтаксиса:

String.Format("{0,20}", "String goes here");
String.Format("{0,-20}", "String goes here");

Ответ 3

Вам показали PadLeft и PadRight. Это заполнит отсутствующий PadCenter.

public static class StringUtils
{
    public static string PadCenter(this string s, int width, char c)
    {
        if (s == null || width <= s.Length) return s;

        int padding = width - s.Length;
        return s.PadLeft(s.Length + padding / 2, c).PadRight(width, c);
    }
}

Примечание для себя: не забудьте обновить собственное резюме: "Однажды я даже установил код Джоэля Коэхорна!"; -D -Serge

Ответ 4

Как и в Visual Studio 2015, вы также можете сделать это с помощью Interpolated Strings (это трюк компилятора, поэтому не имеет значения, какая версия рамки .net, на которые вы нацелились).

string value = "String goes here";
string txt1 = $"{value,20}";
string txt2 = $"{value,-20}";

Ответ 5

попробуйте следующее:

"String goes here".PadLeft(20,' ');
"String goes here".PadRight(20,' ');

для центра получить длину строки и сделать padleft и padright с необходимыми символами

int len = "String goes here".Length;
int whites = len /2;
"String goes here".PadRight(len + whites,' ').PadLeft(len + whites,' ');

Ответ 6

Спасибо за обсуждение, этот метод также работает (VB):

Public Function StringCentering(ByVal s As String, ByVal desiredLength As Integer) As String
    If s.Length >= desiredLength Then Return s
    Dim firstpad As Integer = (s.Length + desiredLength) / 2
    Return s.PadLeft(firstpad).PadRight(desiredLength)
End Function
  • StringCentering() принимает два входных значения и возвращает форматированный строка.
  • Когда длина s больше или равна deisredLength, функция возвращает исходную строку.
  • Если длина s меньше желаемой длины, она будет дополняться двумя концами.
  • Из-за того, что интервал между символами является целым и нет полупространства, мы можем иметь неравномерное разделение пространства. В этой реализации большее разделение переходит к ведущему концу.
  • Для функции требуется .NET Framework из-за PadLeft() и PadRight().
  • В последней строке функции привязка слева направо, поэтому применяется первая панель, а затем панель желаемая длина.

Вот версия С#:

public string StringCentering(string s, int desiredLength)
{
    if (s.Length >= desiredLength) return s;
    int firstpad = (s.Length + desiredLength) / 2;
    return s.PadLeft(firstpad).PadRight(desiredLength);
}

Чтобы помочь понять, используется целочисленная переменная firstpad. s.PadLeft(первая панель) применяет (правильное количество) ведущих пробелов. Самый правый PadRight (wishLength) имеет нижнее связывание, которое заканчивается, применяя конечные пробелы.

Ответ 7

Здесь версия VB.NET, которую я создал, вдохновленная Джоэл Коэхорн, ответ Oliver и комментарий shaunmartin:

    <Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer, ByVal c As Char) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2), c).PadRight(width, c)

End Function

<Extension()>
Public Function PadCenter(ByVal [string] As String, ByVal width As Integer) As String

    If [string] Is Nothing Then [string] = String.Empty
    If (width <= [string].Length) Then Return [string]

    Dim padding = width - [string].Length
    Return [string].PadLeft([string].Length + (padding \ 2)).PadRight(width)

End Function

Это настраивается как расширение строки внутри общедоступного модуля (как вы делаете расширения в VB.NET, немного отличающиеся от С#). Мое небольшое изменение заключается в том, что он обрабатывает пустую строку как пустую строку, и она заполняет пустую строку значением ширины (соответствует моим особым потребностям). Надеюсь, это легко преобразуется в С# для тех, кто в этом нуждается. Если есть лучший способ ссылаться на ответы, изменения и комментарии, упомянутые выше, которые вдохновили мой пост, пожалуйста, дайте мне знать, и я это сделаю - я относительно новичок в публикации, и я не мог понять, оставьте комментарий (возможно, еще не хватит репутации).

Ответ 8

Я отправил статью CodeProject, которая может быть тем, что вы хотите.

Смотрите: Путь С# для косвенной ширины и форматирования стиля.

В основном это метод FormatEx, который действует как String.Format, за исключением того, что он позволяет центрированный модификатор выравнивания.

FormatEx("{0,c10}", value);

Средство центрирует значение varArgs [0] в поле шириной 10 символов, наклоняется вправо, если требуется дополнительное пространство прокладки.

FormatEx("{0,c-10}", value);

Средство центрирует значение varArgs [0] в поле шириной 10 символов, наклоняется влево, если требуется дополнительное пространство прокладки.

Изменить: внутри, это комбинация Joel PadCenter с некоторым анализом для реструктуризации формата и varArgs для вызова String.Format, который делает то, что вы хотите.

-Jesse

Ответ 9

похоже, что вы хотите что-то вроде этого, которое поместит строку в фиксированную точку в строку постоянной длины:

Dim totallength As Integer = 100
Dim leftbuffer as Integer = 5
Dim mystring As String = "string goes here"
Dim Formatted_String as String = mystring.PadLeft(leftbuffer + mystring.Length, "-") + String.Empty.PadRight(totallength - (mystring.Length + leftbuffer), "-")

Обратите внимание, что это будет иметь проблемы, если mystring.length + leftbuffer превышает totallength

Ответ 10

/// <summary>
/// Returns a string With count chars Left or Right value
/// </summary>
/// <param name="val"></param>
/// <param name="count"></param>
/// <param name="space"></param>
/// <param name="right"></param>
/// <returns></returns>
 public static string Formating(object val, int count, char space = ' ', bool right = false)
{
    var value = val.ToString();
    for (int i = 0; i < count - value.Length; i++) value = right ? value + space : space + value;
    return value;
}