2010-02-22 3 views
5

In C# habe ich eine Breite, die ich für einige Zeichenfolgen verwenden möchte, aber ich werde diese Breite nicht bis zur Laufzeit wissen. Ich mache so etwas wie dieses:Nimm nächsten Parameter als Feldbreite in String.Format

string.Format("{0, " + digits + "}", value) // prints 123 as " 123" 

Gibt es eine Zeichenfolge Formatierung-Richtlinie, die mich mein eigenes Format-String angeben können zusammen wie dies ohne Zerschlagung?

Ich habe mich eine Weile auf MSDN umgesehen und ich habe das Gefühl, dass ich ein ganzes Kapitel über Formatstrings oder ähnliches verpasse.

Antwort

7

einen Blick auf PadLeft nehmen:

s = "123".PadLeft(5); // Defaults to spaces 
s = "123".PadLeft(5, '.'); // Pads with dots 
+0

Ich werde dir +1 geben, weil ich peinlich war, dass ich vergessen habe, es war auf der Spitze meiner Zunge. –

2

können Sie so etwas wie

string test = valueString.PadLeft(10,' '); 

oder sogar dümmer

string spaces = String.Concat(Enumerable.Repeat(" ", digits).ToArray()); 
+1

masochistisch .... PadLeft. –

+0

hahah ich weiß, es ist ziemlich lustig, dass ich Padleft vermisste, ich fand es, sobald ich das schrieb. –

1

Die von anderen erwähnten Funktionen wird funktionieren, aber diese MSDN-Seite hat eine allgemeine Lösung für die Formatierung, die zur Laufzeit verändert:

Composite Formatting

Sie geben Beispiele wie das Ihre viel.

Edit: Ich dachte, Sie haben versucht, den allgemeinen Fall des Verfassens einer Formatzeichenfolge zur Laufzeit zu lösen. Zum Beispiel, wenn es keine in PadLeft() gebaut wurden, könnten Sie dies tun:

int myInt = 123; 
    int nColumnWidth = 10; 

    string fmt = string.Format("Price = |{{0,{0}}}|", nColumnWidth); 

    // now fmt = "Price = |{0,5}|" 

    string s = string.Format(fmt, myInt); 

Sie auch alles, was in einer Zeile tun, aber es ist hässlich:

string s = string.Format(
      string.Format("Price = |{{0,{0}}}|", nColumnWidth), 
      myInt); 
+0

Vielleicht bin ich blind, aber ich sehe kein Beispiel auf dieser Seite, das etwas wie das tut, was ich mache. – Ken

0

Vielleicht wird dies helfen Ihre Forschung auf Formatierung:

Formatting Types
Composite Formatting

Howe ver, ich glaube nicht, dass Sie viel besser machen werden, da der alignment-Parameter Teil der Formatzeichenfolge sein muss und nicht durch eine Eigenschaft dargestellt wird.

+1

Wenn "der Alignment-Parameter Teil der Formatzeichenfolge sein muss", beantwortet das meine Frage: es ist nicht möglich aus string.Format. Ich dachte, es gäbe eine Möglichkeit, Params zu verwenden, wie '(format nil" ~ vD "digits value)' in Lisp - Ich weiß, Lisps 'Format' ist im Allgemeinen viel leistungsfähiger, aber ich dachte, dass die Verwendung eines Params grundlegend war genug. Vielen Dank! – Ken

0

Wahrscheinlich Overkill, aber nur um eine Möglichkeit zu veranschaulichen, die Formatspezifikation einzukapseln und eine Überladung von String.Format zu verwenden, die eine IFormatProvider akzeptiert.

class Program 
{ 
    public static void Main(string[] args) 
    { 
     int digits = 7; 
     var format = new PaddedNumberFormatInfo(digits); 
     Console.WriteLine(String.Format(format, "{0}", 123)); 
    } 
} 
class PaddedNumberFormatInfo : IFormatProvider, ICustomFormatter 
{ 
    public PaddedNumberFormatInfo(int digits) 
    { 
     this.DigitsCount = digits; 
    } 

    public int DigitsCount { get; set; } 

    // IFormatProvider Members 
    public object GetFormat(Type formatType) 
    { 
     if (formatType == typeof(ICustomFormatter)) 
      return this; 

     return null; 
    } 
    // ICustomFormatter Members 
    public string Format(string format, object arg, IFormatProvider provider) 
    { 
     return String.Format(
      String.Concat("{0, ", this.DigitsCount, "}"), arg); 
    } 
} 
0

Ich postete einen CodeProject-Artikel, der sein könnte, was Sie wollen.

See: A C# way for indirect width and style formatting.

Grundsätzlich ist es eine Methode, Formatex, die wie String.Format wirkt, außer es für indirekte Ausrichtung und Formatstring-Planer ermöglicht.

FormatEx("{0,{1}:{2}}", value, width, formatString); 

Mittel formatieren Sie den Wert von varargs 0, in einer Feldbreite angegeben durch varargs 1, einen formattingString Code von varargs angegeben mit 2.

Edit: Intern es tut, was viele andere in vorgeschlagen haben ihre Antworten. Ich habe gerade das Parsing und die Bestimmung der endgültigen Werte für Alignment und formatString abgeschlossen. Ich habe auch einen "Center Alignment" Modifier hinzugefügt.

-Jesse