.NET Форматирование строки с фиксированными пробелами - PullRequest
182 голосов
/ 13 марта 2009

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

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

Как это сделать с помощью .NET?

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

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

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

Ответы [ 10 ]

431 голосов
/ 13 марта 2009

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

string s = "String goes here";
string lineAlignedRight  = String.Format("{0,27}", s);
string lineAlignedCenter = String.Format("{0,-27}",
    String.Format("{0," + ((27 + s.Length) / 2).ToString() +  "}", s));
string lineAlignedLeft   = String.Format("{0,-27}", s);
60 голосов
/ 13 марта 2009

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

String.Format("{0,20}", "String goes here");
String.Format("{0,-20}", "String goes here");
30 голосов
/ 30 ноября 2016

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

string value = "String goes here";
string txt1 = $"{value,20}";
string txt2 = $"{value,-20}";
15 голосов
/ 13 марта 2009

Вы были показаны 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

9 голосов
/ 13 марта 2009

попробуйте это:

"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 голосов
/ 20 сентября 2013

Спасибо за обсуждение, этот метод также работает (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
  1. StringCentering () принимает два входных значения и возвращает отформатированный строка.
  2. Если длина s больше или равна deisredLength , функция возвращает исходную строку.
  3. Если длина s меньше, чем требуемая длина , она будет дополнена с обоих концов.
  4. Из-за того, что межсимвольный интервал целочисленный, а полупространства нет, мы можем иметь неравномерное разделение пробелов. В этой реализации больший раскол идет к ведущему концу.
  5. Для этой функции требуется .NET Framework из-за PadLeft () и PadRight () .
  6. В последней строке функции привязка выполняется слева направо, поэтому применяется firstpad , за которым следует требуемая длина pad.

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

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 (firstpad) применяет (правильное количество) первые пробелы. Крайняя правая PadRight (требуемая длина) имеет нижнюю привязку, заканчивающуюся применением конечных пробелов.

1 голос
/ 24 августа 2011

Вот версия VB.NET, которую я создал, вдохновленный ответом Джоэла Кехорна, правкой Оливера и комментарием Шонмартина:

    <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, немного отличается от C #). Мое небольшое изменение заключается в том, что он обрабатывает пустую строку как пустую строку и дополняет пустую строку значением ширины (соответствует моим конкретным потребностям). Надеюсь, это легко конвертируется в C # для всех, кому это нужно. Если есть лучший способ ссылаться на ответы, правки и комментарии, которые я упомянул выше, что вдохновило меня на мой пост, пожалуйста, дайте мне знать, и я сделаю это - я относительно новичок в публикации и не могу понять оставьте комментарий (возможно, у вас еще недостаточно представителей).

0 голосов
/ 26 ноября 2013
/// <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;
}
0 голосов
/ 14 июня 2012

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

См .: Способ C # для косвенного форматирования ширины и стиля.

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

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

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

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

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

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

-Jesse

0 голосов
/ 13 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...