.NET Formatieren Sie eine Zeichenfolge mit festen Leerzeichen

198

Ermöglicht die .NET String.Format-Methode die Platzierung eines Strings an einer festen Position innerhalb eines Strings mit fester Länge?

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

Wie geht das mit .NET?

Bearbeiten - Ich habe Format / PadLeft / PadRight zu Tode versucht. Sie arbeiten nicht. Ich weiß nicht warum. Am Ende schrieb ich meine eigene Funktion, um dies zu tun.

Bearbeiten - Ich habe einen Fehler gemacht und im Formatbezeichner einen Doppelpunkt anstelle eines Kommas verwendet. Sollte "{0,20}" sein.

Vielen Dank für all die hervorragenden und richtigen Antworten.

user72491
quelle
48
Ich hatte noch nie eine Frage zur Formatierung von Zeichenfolgen, die ich auf dieser Seite nicht beantworten konnte: blog.stevex.net/index.php/string-formatting-in-csharp
jcollum
@jcollum: Ich würde gerne Ihre Antwort abstimmen, aber ich kann nichts für Kommentare tun
Dinah
PadLeft arbeitet für mich und überprüft, ob Sie den Raum in PadLeft verlassen (20, 'HERE GOES A SPACE')
Jedi Master Spooky
Was bedeutet "Raum lassen in". Wenn du meinst - schneide ich die Saite ", dann nein. Es funktioniert immer noch nicht.
user72491

Antworten:

472

Dadurch erhalten Sie genau die Zeichenfolgen, nach denen Sie gefragt haben:

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);
Guffa
quelle
64
Dies sollte als die richtige Antwort auf die Frage markiert werden, aber es sieht so aus, als hätte das OP den Stapelüberlauf verlassen.
Oliver
9
Wenn Sie nach dem grünen Scheck gegen die höchsten Up-Votes suchen, wissen Sie nicht, wie man SO macht;)
Dave Jellison
2
@ DaveJellison Es scheint, als müsste jemand ein Plugin schreiben, um das zu beheben, oder SO sollte es einfach zu einer konfigurierbaren Benutzereinstellung machen.
Walter Stabosz
1
@WalterStabosz konnte nicht mehr zustimmen.
Dave Jellison
2
Warum wird dies ,nicht :wie in allen anderen Formatierungsverfahren verwendet?
LuckyLikey
65

Zumindest der erste und der letzte sind mit der folgenden Syntax möglich:

String.Format("{0,20}", "String goes here");
String.Format("{0,-20}", "String goes here");
Konrad Rudolph
quelle
49

Ab Visual Studio 2015 können Sie dies auch mit interpolierten Zeichenfolgen tun (dies ist ein Compilertrick, sodass es keine Rolle spielt, auf welche Version des .net-Frameworks Sie abzielen).

string value = "String goes here";
string txt1 = $"{value,20}";
string txt2 = $"{value,-20}";
Sprotty
quelle
9
seine ac # 6 Funktion.
LuckyLikey
Ich benutze C # 6 seit Jahren und wusste das nicht! Upvoted :)
Avrohom Yisroel
17

Du wurdest gezeigt PadLeftund PadRight. Dies wird die fehlenden ausfüllen 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);
    }
}

Hinweis für sich selbst: Vergessen Sie nicht, Ihren eigenen Lebenslauf zu aktualisieren: "Eines Tages habe ich sogar Joel Coehoorns Code repariert!" ;-D -Serge

Joel Coehoorn
quelle
Joel, guter Ausschnitt - ich versuche es zu benutzen und es zentriert sich nicht ganz so wie es ist. Die Rückgabezeile sollte ungefähr so ​​aussehen (ich habe nicht genug Wiederholungen zum Bearbeiten ...): return s.PadLeft ((padding / 2) + s.Length, c) .PadRight (width, c);
Shaunmartin
11

Versuche dies:

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

Für die Mitte erhalten Sie die Länge der Zeichenfolge und machen Padleft und Padright mit den erforderlichen Zeichen

int len = "String goes here".Length;
int whites = len /2;
"String goes here".PadRight(len + whites,' ').PadLeft(len + whites,' ');
Jedi-Meister gruselig
quelle
Die Aufrufe von String.Format () scheinen überflüssig zu sein.
Joel Coehoorn
Pad-Methoden sind gut, da die Formatoptionen erfordern, dass Längen Konstanten sind ( String.Format("{0,-length}", something)dh nicht kompiliert werden.
Roberto
6

Vielen Dank für die Diskussion, diese Methode funktioniert auch (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 () akzeptiert zwei Eingabewerte und gibt eine formatierte Zeichenfolge zurück.
  2. Wenn die Länge von s größer oder gleich deisredLength ist , gibt die Funktion die ursprüngliche Zeichenfolge zurück.
  3. Wenn die Länge von s kleiner als die gewünschte Länge ist , werden beide Enden aufgefüllt.
  4. Da der Zeichenabstand eine Ganzzahl ist und kein halber Raum vorhanden ist, kann es zu einer ungleichmäßigen Aufteilung des Raums kommen. Bei dieser Implementierung geht die größere Aufteilung zum führenden Ende.
  5. Die Funktion erfordert .NET Framework aufgrund von PadLeft () und PadRight () .
  6. In der letzten Zeile der Funktion, Bindung wird von links nach rechts, so firstpad durch den aufgebracht wird , gefolgt desiredLength Pad.

Hier ist die C # -Version:

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

Zum besseren Verständnis wird das Integer der Ganzzahlvariablen firstpad verwendet. s.PadLeft (firstpad) wendet die (richtige Anzahl) führender Leerzeichen an. Das PadRight ganz rechts (gewünschte Länge) hat eine niedrigere Bindung, die durch Anwenden von nachgestellten Leerzeichen abgeschlossen wird.

Chi
quelle
1
Willkommen bei SO, Chi. Dies ist ein weiteres Beispiel für einen großartigen ersten Beitrag und eine großartige Antwort. +1
Brian
Danke Brian, die ursprüngliche Frage oben in diesem Beitrag ist ein ausgezeichneter Ausgangspunkt. Ich bin inspiriert von all den Posts und Antworten, die mir vorangegangen sind.
Chi
1

Hier ist eine VB.NET-Version, die ich erstellt habe, inspiriert von Joel Coehoorns Antwort, Olivers Bearbeitung und Shaunmartins Kommentar:

    <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

Dies wird als Zeichenfolgenerweiterung in einem öffentlichen Modul eingerichtet (wie Sie Erweiterungen in VB.NET ausführen, etwas anders als in C #). Meine geringfügige Änderung besteht darin, dass eine Nullzeichenfolge als leere Zeichenfolge behandelt wird und eine leere Zeichenfolge mit dem Breitenwert aufgefüllt wird (entspricht meinen speziellen Anforderungen). Hoffentlich kann dies für jeden, der es benötigt, leicht in C # konvertiert werden. Wenn es eine bessere Möglichkeit gibt, auf die oben erwähnten Antworten, Änderungen und Kommentare zu verweisen, die meinen Beitrag inspiriert haben, lassen Sie es mich bitte wissen und ich werde es tun - ich bin relativ neu im Posten und konnte es nicht herausfinden Hinterlasse einen Kommentar (möglicherweise noch nicht genügend Wiederholungen).

Jeff
quelle
0

Ich habe einen CodeProject-Artikel veröffentlicht, der genau Ihren Wünschen entspricht.

Siehe: AC # Weg für indirekte Breite und Stil Formatierung.

Grundsätzlich handelt es sich um eine Methode, FormatEx, die sich wie String.Format verhält, außer dass sie einen Modifikator für die zentrierte Ausrichtung zulässt.

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

Bedeutet, den Wert von varArgs [0] in einem 10 Zeichen breiten Feld zu zentrieren und nach rechts zu lehnen, wenn ein zusätzlicher Auffüllraum erforderlich ist.

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

Bedeutet, dass der Wert von varArgs [0] in einem 10 Zeichen breiten Feld zentriert wird. Lehnen Sie sich nach links, wenn ein zusätzlicher Platz zum Auffüllen erforderlich ist.

Bearbeiten: Intern ist es eine Kombination aus Joels PadCenter mit einer Analyse, um das Format und varArgs für einen Aufruf von String.Format neu zu strukturieren, der genau das tut, was Sie wollen.

-Jesse

Jesse Chisholm
quelle
-1

Es scheint, als ob Sie so etwas wollen, das Ihre Zeichenfolge an einem festen Punkt in einer Zeichenfolge konstanter Länge platziert:

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), "-")

Beachten Sie, dass dies Probleme verursachen wird, wenn mystring.length + leftbuffer die Gesamtlänge überschreitet

Atilio Jobson
quelle
-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;
}
Paulos02
quelle
3
Verwenden Sie diesen Code nicht - er generiert viele unnötige Zeichenfolgenzuweisungen. Verwenden Sie stattdessen die integrierten Formatspezifizierer und Auffüllmethoden.
Oskar Berggren
1
heilig .. stell dir vor,
du