Dzięki String.Format()
temu można np. Formatować DateTime
obiekty na wiele różnych sposobów. Za każdym razem, gdy szukam żądanego formatu, muszę przeszukać Internet. Prawie zawsze znajduję przykład, którego mogę użyć. Na przykład:
String.Format("{0:MM/dd/yyyy}", DateTime.Now); // "09/05/2012"
Ale nie mam pojęcia, jak to działa i które klasy obsługują te „magiczne” dodatkowe ciągi.
Więc moje pytania to:
- Jak zamapuje
String.Format
dodatkowe informacjeMM/dd/yyyy
na wynik w postaci ciągu? - Czy wszystkie obiekty firmy Microsoft obsługują tę funkcję?
Czy jest to gdzieś udokumentowane? - Czy można zrobić coś takiego:
String.Format("{0:MyCustomFormat}", new MyOwnClass())
Odpowiedzi:
String.Format
dopasowuje każdy z tokenów w ciągu ({0}
itp.) do odpowiedniego obiektu: http://msdn.microsoft.com/en-us/library/system.string.format.aspxOpcjonalnie dostępny jest ciąg formatu:
{ index[,alignment][ : formatString] }
Jeśli
formatString
jest podany, odpowiedni obiekt musi implementować IFormattable, a konkretnieToString
metodę, która akceptujeformatString
i zwraca odpowiedni sformatowany ciąg: http://msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspxIFormatProvider
Można również stosować, które mogą być wykorzystywane do przechwytywania podstawowe formatowanie standardy / domyślne itd. Przykłady tutaj i tutaj .A więc odpowiedzi na Twoje pytania w kolejności:
Używa metody
IFormattable
interfejsuToString()
naDateTime
obiekcie i przekazuje tenMM/dd/yyyy
ciąg formatu. To jest ta implementacja, która zwraca poprawny ciąg.Każdy obiekt, który implementuje,
IFormattable
obsługuje tę funkcję. Możesz nawet napisać własne!Tak, patrz wyżej.
źródło
IFormattable
, gdzie mogę znaleźć dozwolone formatStrings. Na przykład obsługuje DateTime (na czele)y M d h m s
i nie tylko. Typy nummeric obsługująC
z waluty, ale to nie wszystko, co wiem z wyszukiwania w okolicy, a nie z przeglądania dokumentacji Microsoft.Z mojego punktu widzenia, aby to obsługiwać, musisz zaimplementować IFormattable w swojej klasie. To ma następnie metodę ToString, która przyjmuje parametry przekazane do String.Format.
Oto przykład.
// 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())
źródło
Sprawdź oficjalną dokumentację MSDN, pełna lista ciągów formatu DateTime znajduje się tutaj: http://msdn.microsoft.com/en-us/library/az4se3k1.aspx . Rzeczywiście istnieje kilka „magicznych” strun.
O ile wiem, nie wszystkie typy mają „interesujące” formatowanie, ale wszystkie je obsługują
ToString()
. Jeśli potrzebujesz sformatować wbudowany obiekt, możesz dodać metodę rozszerzenia, aby to zrobić, ale zwykle formatowanie jest dostarczane w dowolnym miejscu, w którym jest potrzebne (lub inaczej, napisałem tylko niestandardowe elementy formatujące dla moich własnych typów) .Tak, możesz napisać własne, a jeśli masz dane, które można sformatować na różne sposoby, prawdopodobnie powinieneś napisać niestandardowy program formatujący, implementując IFormattable, ponownie zapoznaj się z dokumentacją tutaj: http://msdn.microsoft.com/en-us/ biblioteka / system.iformattable.aspx . To dość proste, wystarczy sprawdzić podane ciągi znaków i na ich podstawie wypisać dane, za kulisami nie ma magii :-)
źródło
Pod okładkami String.Format robi coś w następujący sposób,
IFormattable formattable = objectToFormat as IFormattable; if (formattable != null) { formattable.ToString(objectToFormat); } else { objectToFormat.ToString(); }
W przypadku pytań
W jaki sposób String.Format mapuje dodatkowe informacje MM / dd / rrrr na wynik w postaci łańcucha?
Jak określono powyżej, po prostu wywołuje IFormattable .ToString (format ciągu, dostawca IFormatProvider). Dostawca jest często kimś, kto mówi ci, jaka jest kultura twojego systemu. Często null, ponieważ ludzie nie przekazują tego String.Format (), tak jak w Twoim przypadku.
Czy wszystkie obiekty Microsoft obsługują tę funkcję? Czy jest to gdzieś udokumentowane?
Wszystko, co implementuje IFormattable, robi.
Czy można zrobić coś takiego:
String.Format("{0:MyCustomFormat}, new MyOwnClass())
Zasadniczo, jeśli chcesz, aby Twój własny obiekt robił coś z dostarczonym przez Ciebie formatem
IFormattable
.Istnieje ogromna liczba klas pomocniczych i modułów wyliczających, które zapewniają, że ciągi formatujące są w dużej mierze podobne. Więcej tutaj .
źródło
Tak, jest to możliwe - można go całkowicie dostosować. Spójrz na to łącze do dokumentacji dotyczące niestandardowego formatowania daty i godziny.
Jeśli masz swój własny obiekt, to od ciebie zależy, czy zmienisz
ToString()
metodę i wyprowadzisz wszystko, co uważasz za odpowiednią reprezentację. Gdy to zrobisz, możesz użyć,String.Format("{0:MyCustomFormat}", new MyOwnClass())
ponieważ to niejawnie wywołujeMyOwnClass.ToString()
źródło
DateTime
formatowanie. Sam link nie jest odpowiedzią.Dokumentację dotyczącą dat można znaleźć tutaj: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
To powinno dokładnie powiedzieć, co oznaczają wszystkie znaki formatujące datę, takie jak MM.
Jeśli chcesz zmienić sposób wyprowadzania ciągu dla klasy niestandardowej, możesz zastąpić metodę ToString, na przykład:
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."; } }
a następnie możesz po prostu zrobić coś podobnego
myUser.ToString()
i uzyskać określone wyjście.źródło
Odpowiadając na trzecie pytanie: nie jest to możliwe przy tej składni, ale możesz podać wystąpienia
IFormatProvider
iICustomFormatter
dla typu, którego nie utworzyłeś, lub zaimplementowaćIFormattable
w swoim typie (chociaż to zasadniczo się rozszerzaToString
).źródło