.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;
}