.NET Відформатуйте рядок з фіксованими пробілами


199

Чи дозволяє метод .NET String.Format розміщувати рядок у фіксованому положенні у межах рядка фіксованої довжини.

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

Як це робиться за допомогою .NET?

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

Редагувати - я допустив помилку і використовував двокрапку замість коми через специфікатор формату. Має бути "{0,20}".

Дякую за всі чудові та правильні відповіді.


48
У мене ніколи не було запитання щодо форматування рядків, на яке я не міг відповісти, перейшовши на цю сторінку: blog.stevex.net/index.php/string-formatting-in-csharp
jcollum

@jcollum: Я хотів би підтвердити свою відповідь, але не можна робити коментарі
Dinah

PadLeft працює для мене, щоб переконатися, що ви залишаєте місце в PadLeft (20, "ТУТ Йде проміжок")
майстер джедаїв Spooky

Що означають "залишення місця в". Якщо ви маєте на увазі - я "підстригаю" струну, то ні. Це все ще не працює.
користувач72491

Відповіді:


473

Це дасть вам саме ті рядки, про які ви просили:

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);

64
Це повинно бути позначено як правильну відповідь на питання, але схоже, що ОП залишило потоковий процес.
Олівер

9
Якщо ви шукаєте зелений чек проти найвищих голосів, ви не знаєте як це;)
Дейв Джеллісон

2
@DaveJellison Схоже, що комусь потрібно написати плагін, щоб виправити це, або ТАК повинен просто зробити його налаштованим налаштуванням користувача.
Вальтер Стабош

1
@WalterStabosz не міг погодитися більше.
Дейв Джеллісон

2
чому це робиться ,замість того, :як у всіх інших формах використання форматування?
LuckyLikey

65

Перший і останній, принаймні, можливі, використовуючи наступний синтаксис:

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

49

Станом на Visual Studio 2015, ви також можете це зробити за допомогою інтерпольованих рядків (це трюк компілятора, тому не має значення, на яку версію рамки .net ви орієнтуєтесь).

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

9
його зміна № 6.
LuckyLikey

Я використовую C # 6 протягом багатьох років і не знав цього! Upvoted :)
Аврохом Ісроель

17

Вам показали 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 -Серж


Джоель, хороший фрагмент - я намагаюся його використовувати, але він не зовсім центр, як є. Схоже, що зворотний рядок повинен бути чимось на зразок (мені не вистачає повтору для редагування ...): return s.PadLeft ((padding / 2) + s.Length, c) .PadRight (ширина, c);
shaunmartin

11

спробуйте це:

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

для центру отримайте довжину струни і зробіть підвісний і прямолінійний потрібні символи

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

Схоже, дзвінки String.Format () зайві.
Joel Coehoorn

Методи String.Format("{0,-length}", something)
Роберто

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
  1. StringCentering () приймає два вхідні значення і повертає відформатований рядок.
  2. Коли довжина s більша або дорівнює deisredLength , функція повертає початкову рядок.
  3. Якщо довжина s менша від потрібної довжини , вона буде оббита обома кінцями.
  4. Через інтервал символів цілий, і немає півпростору, ми можемо мати нерівномірний поділ простору. У цій реалізації більший розкол йде до провідної мети.
  5. Функція вимагає .NET Framework завдяки PadLeft () та PadRight () .
  6. В останньому рядку функції прив'язка відбувається зліва направо, тому накладається перша панель, а потім - потрібна колодка Length .

Ось версія 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 (бажаний Length) має нижню обробку прив’язки, застосовуючи пробіли білого кольору.


1
Ласкаво просимо до SO, чі. Це ще один приклад ВЕЛИКОГО першого повідомлення та відповіді. +1
Брайан

Дякую Брайану, оригінальне запитання вгорі цієї публікації є відмінною відправною точкою. Мене надихають усі пости та відповіді, що передували моєму.
чі

1

Ось версія 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

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

Див.: AC # спосіб непрямої ширини та форматування стилів.

В основному це метод FormatEx, який діє як String.Format, за винятком того, що він дозволяє сконцентрувати модифікатор вирівнювання.

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

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

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

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

Редагувати: Внутрішнє, це комбінація PadCenter Joel з деяким розбором для реструктуризації формату та varArgs для виклику String.Format, що робить те, що ви хочете.

-Джессе


-1

здається, що ви хочете щось подібне, що розмістить вас у фіксованій точці в рядку постійної довжини:

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 перевищує загальну довжину


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

3
Не використовуйте цей код - він генерує безліч зайвих виділень рядків. Замість цього використовуйте вбудовані специфікатори формату та методи накладки.
Оскар Берггрен

1
святий .. уявіть, як це використовувати в циклі :)
LuckyLikey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.