Frage String.Format - wie es funktioniert und wie man benutzerdefinierte Formatstrings implementiert


Mit String.Format() Es ist möglich, zum Beispiel zu formatieren DateTime Objekte auf viele verschiedene Arten. Jedes Mal, wenn ich nach einem gewünschten Format suche, muss ich im Internet suchen. Fast immer finde ich ein Beispiel, das ich benutzen kann. Beispielsweise:

String.Format("{0:MM/dd/yyyy}", DateTime.Now);          // "09/05/2012"

Aber ich habe keine Ahnung, wie es funktioniert und welche Klassen diese "magischen" zusätzlichen Strings unterstützen.

Also meine Fragen sind:

  1. Wie geht es? String.Format Ordnen Sie die zusätzlichen Informationen zu MM/dd/yyyy zu einem String Ergebnis?
  2. Unterstützen alle Microsoft-Objekte diese Funktion?
    Ist das irgendwo dokumentiert?
  3. Ist es möglich, so etwas zu tun:
    String.Format("{0:MyCustomFormat}", new MyOwnClass())

76
2018-05-09 08:20


Ursprung


Antworten:


String.Format passt auf jedes der Token innerhalb der Zeichenfolge ({0} usw.) gegen das entsprechende Objekt: http://msdn.microsoft.com/en-us/library/system.string.format.aspx

Eine Format-Zeichenfolge ist optional verfügbar:

{ index[,alignment][ : formatString] }

Ob formatString bereitgestellt wird, muss das entsprechende Objekt implementiert werden IFormattabel und speziell die ToString Methode, die akzeptiert formatString und gibt die entsprechende formatierte Zeichenfolge zurück: http://msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx

Ein IFormatProvider kann auch verwendet werden, um grundlegende Formatierungsstandards / Standardeinstellungen usw. zu erfassen. Beispiele Hier und Hier.

Also die Antworten auf Ihre Fragen in der Reihenfolge:

  1. Es nutzt die IFormattable Schnittstelle ist ToString() Methode auf der DateTime Objekt und übergibt, dass die MM/dd/yyyy Formatzeichenfolge Es ist diese Implementierung, die die richtige Zeichenfolge zurückgibt.

  2. Jedes Objekt, das implementiert wird IFormattable unterstützt diese Funktion. Sie können sogar Ihre eigenen schreiben!

  3. Ja, siehe oben.


80
2018-05-09 08:27



Aus meiner Sicht müssten Sie IFormattable in Ihrer Klasse implementieren, um dies zu unterstützen. Das hat dann die Methode ToString, die die übergebenen Parameter in String.Format übernimmt.

Hier ist ein Beispiel.

// Define other methods and classes here
public class Sample : IFormattable
{
     public string ToString(string format, IFormatProvider provider)
     {
         return String.Concat("Your custom format was ", format);
     }
}

String.Format("{0:MyCustomFormat}", new Sample())

16
2018-05-09 08:26



  1. Überprüfen Sie die offiziellen MSDN-Dokumente, hier finden Sie eine vollständige Liste der DateTime-Formatzeichenfolgen: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx. Es gibt tatsächlich einige "magische" Saiten.

  2. Soweit ich weiß, haben nicht alle Typen "interessante" Formatierungen, aber alle Typen unterstützen ToString(). Wenn Sie ein eingebautes Objekt formatieren müssten, könnten Sie dafür eine Erweiterungsmethode hinzufügen, aber gewöhnlich Formatierung wird an jedem Ort zur Verfügung gestellt, wo es benötigt wird (oder anders gesagt, ich habe nur benutzerdefinierte Formatierer für meine eigenen Typen geschrieben).

  3. Ja, Sie können Ihre eigenen schreiben und wenn Sie Daten haben, die auf verschiedene Arten formatiert werden können, sollten Sie wahrscheinlich einen benutzerdefinierten Formatierer schreiben, indem Sie IFormattable implementieren. http://msdn.microsoft.com/en-us/library/system.iformattable.aspx. Es ist ziemlich einfach, Sie überprüfen einfach die bereitgestellten Zeichenfolgen und schreiben Ihre Daten basierend darauf aus, es gibt keine Magie hinter den Kulissen :-)


4
2018-05-09 08:28



Unter der Decke tut String.Format etwas wie folgt,

IFormattable formattable = objectToFormat as IFormattable;
if (formattable != null)
{
    formattable.ToString(objectToFormat);
}
else
{
    objectToFormat.ToString();
}

Für deine Fragen,

  1. Wie ordnet String.Format die zusätzlichen Informationen MM / TT / JJJJ einem String-Ergebnis zu?

    Wie oben angegeben, ruft es nur die IFormattable .ToString (String-Format, IFormatProvider-Provider). Der Anbieter sagt oft etwas über die Kultur Ihres Systems aus. Oft Null, weil Leute String.Format () nicht wie in Ihrem Fall weitergeben.

  2. Unterstützen alle Microsoft-Objekte diese Funktion? Ist das irgendwo dokumentiert?

    Alles, was IFormattable implementiert, tut es auch.

  3. Ist es möglich, so etwas zu tun: String.Format("{0:MyCustomFormat}, new MyOwnClass())

    Wenn Sie möchten, dass Ihr eigenes Objekt etwas mit dem von Ihnen implementierten Format ausführt IFormattable.

Es gibt eine große Anzahl von unterstützenden Klassen und Enumeratoren, um sicherzustellen, dass diese Formatzeichenfolgen jedoch vorhanden sind weitgehend ähnlich. Mehr hier.


3
2018-05-09 08:32



Ja, es ist möglich - es kann komplett angepasst werden. Ansehen Dies Dokumentationslink zur benutzerdefinierten Formatierung von Datum und Uhrzeit.

Wenn Sie ein eigenes Objekt haben, müssen Sie es überschreiben ToString() Methode und Ausgabe, was immer Sie für eine angemessene Darstellung halten. Sobald Sie dies tun, können Sie verwenden String.Format("{0:MyCustomFormat}", new MyOwnClass()) weil dies implizit aufruft MyOwnClass.ToString()


0
2018-05-09 08:24



Die Dokumentation für Termine finden Sie hier: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

Das sollte Ihnen genau sagen, was alle Datumsformatierungszeichen wie MM bedeuten.

Wenn Sie die Ausgabe einer Zeichenfolge für eine benutzerdefinierte Klasse ändern möchten, können Sie die ToString-Methode wie folgt überschreiben:

public class User
{
     public string Name { get; set; }
     public int Age { get; set; }

     public override string ToString()
     {
         return this.Name + " is " + this.Age + " years old.";
     }
}

und dann kannst du einfach so etwas tun myUser.ToString() und erhalte die von dir angegebene Ausgabe.


0
2018-05-09 08:26



Und um Ihre dritte Frage zu beantworten: Das ist mit dieser Syntax nicht möglich, aber Sie können Instanzen von IFormatProvider und ICustomFormatter für einen Typ, den Sie nicht erstellt oder implementiert haben IFormattable in Ihrem Typ (obwohl, das im Grunde erweitert ToString).


0
2018-05-09 08:29