2010-02-22 10 views
5

W języku C#, mam szerokość, której chcę użyć dla niektórych ciągów, ale nie będę znać tej szerokości do czasu wykonywania. Robię coś takiego:Podjęcie następnego parametru jako szerokość pola w String.Format

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

istnieje ciąg dyrektywa formatowania, które pozwala mi określić to bez rozbijania mój własny format ciąg razem w ten sposób?

Rozglądałem się przez chwilę na MSDN i czuję, że brakuje mi całego rozdziału na temat ciągów formatów lub czegoś podobnego.

Odpowiedz

7

Spójrz na PadLeft:

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

Będę ci dawać +1, ponieważ jestem zakłopotany, zapomniałem o padleft, to było na czubku mojego języka. –

2

można zrobić coś podobnego

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

lub nawet głupsze

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

masochistyczne .... PadLeft. –

+0

hahah Wiem, że to całkiem zabawne, że przegapiłem padleft, znalazłem to tak szybko, jak to napisałem. –

1

Funkcje wymienione przez innych będzie działać, ale ta strona MSDN ma bardziej ogólne rozwiązanie formatowania, który zmienia w czasie wykonywania:

Composite Formatting

Dają przykłady podobnie jak Twoja.

Edytuj: Myślałem, że próbujesz rozwiązać ogólny przypadek komponowania ciągu formatu w czasie wykonywania. Na przykład, jeśli nie zostały zbudowane w PadLeft(), można to zrobić:

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

Można nawet zrobić to wszystko w jednej linii, ale jest brzydki:

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

Może jestem ślepy, ale nie widzę żadnego przykładu na tej stronie, który robi coś podobnego do tego, co robię. – Ken

0

Może to pomoże z badań na temat formatowania:

Formatting Types
Composite Formatting

Howe ver, nie sądzę, że zamierzasz zrobić o wiele lepiej, ponieważ parametr wyrównania musi być częścią ciągu formatu i nie wydaje się być reprezentowany przez właściwość.

+1

Jeśli "parametr wyrównania musi być częścią ciągu formatu", to odpowiada na moje pytanie: nie jest możliwe z ciągu.Format. Pomyślałem, że będzie jakiś sposób użycia paramów, takich jak '(format zero" ~ vD "wartości cyfr)' w Lisp - wiem, że format 'Lisp 'jest ogólnie o wiele potężniejszy, ale pomyślałem, że użycie paramu było podstawowym dość. Dzięki! – Ken

0

Prawdopodobnie przesada, ale tylko po to, by zilustrować sposób enkapsulacji specyfikacji formatu i użyć przeciążenia z String.Format, który akceptuje IFormatProvider.

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

Wysłałem artykuł CodeProject, który może być tym, co chcesz.

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

Zasadniczo jest to metoda, FormatEx, który działa jak String.Format, oprócz tego, że pozwala na dostosowanie pośrednim ŁAŃCUCH_FORMATUJĄCY specyfikatorami.

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

Środki sformatować wartość varargs 0, w polu o szerokości określonej przez varargs 1, przy użyciu kodu formattingString określony przez varargs 2.

Edit: Wewnętrznie, że robi to, co wielu innych zasugerował w ich odpowiedzi. Właśnie owinąłem parsowanie i ustalenie ostatecznych wartości do użycia dla wyrównania i formatuString. Dodałem również modyfikator "wyśrodkowania".

-Jesse

Powiązane problemy