Pad nach links oder rechts mit string.format (nicht PadLeft oder PadRight) mit beliebigem String

StackOverflow https://stackoverflow.com/questions/541098

Frage

Kann ich String.Format (), um Pad eine bestimmte Zeichenfolge mit beliebigen Zeichen?

Console.WriteLine("->{0,18}<-", "hello");
Console.WriteLine("->{0,-18}<-", "hello");

returns 

->             hello<-
->hello             <-

Ich möchte nun die Räume ein beliebiges Zeichen sein. Der Grund, warum ich es nicht mit PadLeft tun kann oder PadRight ist, weil ich das Format String erstellen an einem anderen Ort / Zeit in der Lage sein wollen, dann wird die Formatierung tatsächlich ausgeführt wird.

- EDIT -
Gesehen, dass es nicht scheint, eine bestehende Lösung für mein Problem zu sein, ich kam auf diesem (nach Denken Sie, bevor Vorschlag des Coding)
- EDIT2 -
Ich brauchte einige komplexere Szenarien, damit ich für Denken Sie, bevor

[TestMethod]
public void PaddedStringShouldPadLeft() {
    string result = string.Format(new PaddedStringFormatInfo(), "->{0:20:x} {1}<-", "Hello", "World");
    string expected = "->xxxxxxxxxxxxxxxHello World<-";
    Assert.AreEqual(result, expected);
}
[TestMethod]
public void PaddedStringShouldPadRight()
{
    string result = string.Format(new PaddedStringFormatInfo(), "->{0} {1:-20:x}<-", "Hello", "World");
    string expected = "->Hello Worldxxxxxxxxxxxxxxx<-";
    Assert.AreEqual(result, expected);
}
[TestMethod]
public void ShouldPadLeftThenRight()
{
    string result = string.Format(new PaddedStringFormatInfo(), "->{0:10:L} {1:-10:R}<-", "Hello", "World");
    string expected = "->LLLLLHello WorldRRRRR<-";
    Assert.AreEqual(result, expected);
}
[TestMethod]
public void ShouldFormatRegular()
{
    string result = string.Format(new PaddedStringFormatInfo(), "->{0} {1:-10}<-", "Hello", "World");
    string expected = string.Format("->{0} {1,-10}<-", "Hello", "World");
    Assert.AreEqual(expected, result);
}

Da der Code ein bisschen zu viel war in einem Beitrag zu setzen, zog ich es zu GitHub als Kern:
http://gist.github.com/533905#file_padded_string_format_info

Es gibt Menschen kann es leicht verzweigen und was auch immer:)

War es hilfreich?

Lösung

Es gibt eine andere Lösung.

Implementieren IFormatProvider eine ICustomFormatter zurückzukehren, die string.Format weitergegeben werden:

public class StringPadder : ICustomFormatter
{
  public string Format(string format, object arg,
       IFormatProvider formatProvider)
  {
     // do padding for string arguments
     // use default for others
  }
}

public class StringPadderFormatProvider : IFormatProvider
{
  public object GetFormat(Type formatType)
  { 
     if (formatType == typeof(ICustomFormatter))
        return new StringPadder();

     return null;
  }
  public static readonly IFormatProvider Default =
     new StringPadderFormatProvider();
}

Dann können Sie es wie folgt verwendet werden:

string.Format(StringPadderFormatProvider.Default, "->{0:x20}<-", "Hello");

Andere Tipps

Sie können die Zeichenfolge in einer Struktur einkapseln, die IFormattable

implementiert
public struct PaddedString : IFormattable
{
   private string value;
   public PaddedString(string value) { this.value = value; }

   public string ToString(string format, IFormatProvider formatProvider)
   { 
      //... use the format to pad value
   }

   public static explicit operator PaddedString(string value)
   {
     return new PaddedString(value);
   }
}

Dann ist diese verwenden wie folgt aus:

 string.Format("->{0:x20}<-", (PaddedString)"Hello");

Ergebnis:

"->xxxxxxxxxxxxxxxHello<-"

Ganz einfach:



    dim input as string = "SPQR"
    dim format as string =""
    dim result as string = ""

    'pad left:
    format = "{0,-8}"
    result = String.Format(format,input)
    'result = "SPQR    "

    'pad right
    format = "{0,8}"
    result = String.Format(format,input)
    'result = "    SPQR"


Edit:. Ich Ihre Frage falsch verstanden, ich dachte, Sie zu fragen, wie man mit dem Leerzeichen

Was Sie fragen, ist nicht möglich, die string.Format Ausrichtungskomponente verwendet wird; string.Format Pads immer mit Leerzeichen. Siehe die Ausrichtung Komponente Abschnitt MSDN: Composite-Formatierung .

Nach Reflector, das ist der Code, der innerhalb StringBuilder.AppendFormat(IFormatProvider, string, object[]) läuft, die durch string.Format genannt wird:

int repeatCount = num6 - str2.Length;
if (!flag && (repeatCount > 0))
{
    this.Append(' ', repeatCount);
}
this.Append(str2);
if (flag && (repeatCount > 0))
{
    this.Append(' ', repeatCount);
}

Wie Sie sehen können, Rohlinge werden mit Leerzeichen hart codiert gefüllt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top