web-dev-qa-db-de.com

Füllen Sie links oder rechts mit string.format (nicht padleft oder padright) mit einer beliebigen Zeichenfolge auf

Kann ich mit String.Format () einen bestimmten String mit beliebigen Zeichen auffüllen?

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

returns 

->             hello<-
->hello             <-

Ich möchte nun, dass die Leerzeichen ein beliebiges Zeichen sind. Der Grund, warum ich es nicht mit padLeft oder padRight machen kann, ist, dass ich die Formatzeichenfolge an einer anderen Stelle/zu einer anderen Zeit erstellen möchte, als die Formatierung tatsächlich ausgeführt wird.

- EDIT -
Da es anscheinend keine Lösung für mein Problem gibt, kam ich auf diese Idee (nach Vorschlag von Think Before Coding )
- EDIT2 -
Ich brauchte einige komplexere Szenarien, also entschied ich mich für Think Before Coding's zweiter Vorschlag

[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 etwas zu viel war, um ihn in einen Beitrag einzufügen, habe ich ihn als Gist nach github verschoben:
http://Gist.github.com/533905#file_padded_string_format_info

Dort kann man es leicht abzweigen und was auch immer :)

57
Boris Callens

Es gibt eine andere Lösung.

Implementieren Sie IFormatProvider, um ein ICustomFormatter zurückzugeben, das an string.Format übergeben wird:

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 kannst du es so benutzen:

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

Sie können die Zeichenfolge in eine 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 benutze dies so:

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

ergebnis:

"->xxxxxxxxxxxxxxxHello<-"
11

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"

2
Emax83

Edit: Ich habe deine Frage falsch verstanden, ich dachte, du fragst, wie man mit Leerzeichen auffüllt.

Was Sie fragen, ist mit der Ausrichtungskomponente string.Format Nicht möglich. string.Format Wird immer mit Leerzeichen aufgefüllt. Siehe den Abschnitt Alignment Component von MSDN: Composite Formatting .

Laut Reflector ist dies der Code, der in StringBuilder.AppendFormat(IFormatProvider, string, object[]) ausgeführt wird und von string.Format Aufgerufen 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, sind Leerzeichen hartcodiert, um mit Leerzeichen gefüllt zu werden.

2
configurator