Was macht IFormatProvider?
-
21-08-2019 - |
Frage
Ich habe das Spiel mit der DateTime.ParseExact Methode, und sie will ein IFormatProvider ...
Es funktioniert Eingabe von null, aber was genau macht sie?
Lösung
In adition zu Ian Boyd Antwort:
Auch CultureInfo
implementiert diese Schnittstelle und kann in Ihrem Fall verwendet werden. So könnte man ein Französisch Datum Zeichenfolge beispielsweise analysieren; Sie nutzen könnten
var ci = new CultureInfo("fr-FR");
DateTime dt = DateTime.ParseExact(yourDateInputString, yourFormatString, ci);
Andere Tipps
Die IFormatProvider
Schnittstelle wird in der Regel für Sie durch eine CultureInfo
Klasse implementiert, z.
-
CultureInfo.CurrentCulture
-
CultureInfo.CurrentUICulture
-
CultureInfo.InvariantCulture
-
CultureInfo.CreateSpecificCulture("de-CA") //German (Canada)
Die Schnittstelle ist ein Gateway für eine Funktion eine Reihe von kulturspezifischen Daten aus einer Kultur zu erhalten. Die zwei allgemein verfügbaren Kulturobjekte, die ein IFormatProvider
für abgefragt werden kann:
-
DateTimeFormatInfo
-
NumberFormatInfo
Die Art und Weise, es wäre normal arbeiten wird Sie bitten, die IFormatProvider
Sie Objekt eine DateTimeFormatInfo
zu geben:
DateTimeFormatInfo format;
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
if (format != null)
DoStuffWithDatesOrTimes(format);
Es gibt auch Insider-Wissen, dass jede IFormatProvider
Schnittstelle wahrscheinlich durch eine Klasse umgesetzt wird, die von CultureInfo
absteigt, oder stammt von DateTimeFormatInfo
, so könnten Sie die Schnittstelle umgewandelt direkt:
CultureInfo info = provider as CultureInfo;
if (info != null)
format = info.DateTimeInfo;
else
{
DateTimeFormatInfo dtfi = provider as DateTimeFormatInfo;
if (dtfi != null)
format = dtfi;
else
format = (DateTimeFormatInfo)provider.GetFormat(typeof(DateTimeFormatInfo));
}
if (format != null)
DoStuffWithDatesOrTimes(format);
Aber tun das nicht
Alles, harte Arbeit wurde Ihnen bereits geschrieben:
Um eine DateTimeFormatInfo
von einem IFormatProvider
zu erhalten :
DateTimeFormatInfo format = DateTimeFormatInfo.GetInstance(provider);
Um eine NumberFormatInfo
von einem IFormatProvider
zu erhalten :
NumberFormatInfo format = NumberFormatInfo.GetInstance(provider);
Der Wert von IFormatProvider
ist, dass Sie Ihre eigene Kultur Objekte erstellen. Solange sie IFormatProvider
implementieren, und das Rück Objekte, die sie gefragt werden, können Sie die integrierten in Kulturen umgehen.
IFormatProvider
- Sie können auch IFormatProvider
für eine Art und Weise der Weitergabe beliebige Kulturobjekte verwenden. Z.B. der Name Gott in verschiedenen Kulturen
- Gott
- Gott
- Jehova
- Jahwes
- יהוה
- אהיה אשר אהיה
Auf diese Weise können Sie Ihre individuelle LordsNameFormatInfo
Klasse Fahrt entlang innerhalb eines IFormatProvider
, und Sie können das Idiom erhalten.
In der Realität werden Sie nie brauchen GetFormat
Methode von IFormatProvider
selbst zu nennen.
Wenn Sie eine IFormatProvider
benötigen, können Sie ein CultureInfo
Objekt übergeben:
DateTime.Now.ToString(CultureInfo.CurrentCulture);
endTime.ToString(CultureInfo.InvariantCulture);
transactionID.toString(CultureInfo.CreateSpecificCulture("qps-ploc"));
Hinweis : Jeder Code wird in die Public Domain freigegeben. Keine Zuordnung erforderlich.
Passing null als der IFormatProvider
nicht der richtige Weg, dies zu tun. Wenn der Benutzer ein benutzerdefiniertes Datum / Zeit-Format auf dem PC hat haben Sie Probleme beim Parsen und Umwandlung in einem String. Ich habe gerade einen Fehler behoben, bei dem jemand null als IFormatProvider war vergangen, als in String umgewandelt wird.
Stattdessen sollten Sie CultureInfo.InvariantCulture
werden mit
Falsch:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", null);
Richtig:
string output = theDate.ToString("dd/MM/yy HH:mm:ss.fff", CultureInfo.InvariantCulture);
Sie sehen hier http://msdn.microsoft.com/ en-us / library / system.iformatprovider.aspx
Sehen Sie die Bemerkungen und Beispiel Abschnitt gibt.
IFormatProvider bietet Kultur Informationen zu dem Verfahren in Frage. Datetime implementiert IFormatProvider, und ermöglicht es Ihnen, das Format, Sie möchten Ihre Zeit / Datum in angezeigt werden. Beispiele finden Sie auf den entsprechenden MSDN-Seiten.
Überprüfen Sie http://msdn.microsoft.com/en- us / library / system.iformatprovider.aspx für die API.
Mit dem MSDN
Das .NET Framework enthält die folgenden drei vordefinierte IFormatProvider Implementierungen kulturspezifische Informationen, die bei der Formatierung oder Parsen von numerischen und Datums- und Zeitwerte verwendet wird:
- Die
NumberFormatInfo
-Klasse, die Informationen liefert, die Format-Nummern, wie die Währung verwendet wird, Tausendertrennzeichen und Dezimaltrennzeichen Symbole für eine bestimmte Kultur. Weitere Informationen zu dem vordefinierten Zeichenketten-Format von einemNumberFormatInfo
Objekt erkannt und in numerischen Formatierungsoperationen verwendet werden, siehe Standard-Zahlenformatzeichenfolgen und Benutzerdefinierte Zahlenformatzeichenfolgen. - Die
DateTimeFormatInfo
-Klasse, die Informationen liefert, der Datum- und Uhrzeit, wie Datum und Zeit-Trennzeichen für eine bestimmte Kultur oder die Reihenfolge und das Format eines Datums Jahr, Monat und Tag Komponenten verwendet wird. Weitere Informationen zu den vordefinierten Zeichenketten-Format von einemDateTimeFormatInfo
Objekt erkannt und in numerischen Formatierungsoperationen verwendet werden, siehe Datums- und Uhrzeitstandardformatzeichenfolgen und Benutzerdefinierte Datums- und Zeitformatstrings. - Die
CultureInfo
-Klasse, die eine bestimmte Kultur darstellt. SeineGetFormat
Methode gibt ein kulturspezifischeNumberFormatInfo
oderDateTimeFormatInfo
Objekt, je nachdem, ob dasCultureInfo
Objekt in einer Formatierung oder Parsen Operation verwendet wird, die Zahlen oder Datumsangaben und Zeiten beinhaltet.
Das .NET Framework unterstützt auch benutzerdefinierte Formatierung. Dies umfasst in der Regel die Schaffung einer Formatierung Klasse, die beide IFormatProvider und ICustomFormatter implementiert. Eine Instanz dieser Klasse wird dann als Parameter an eine Methode übergeben, die eine benutzerdefinierte Formatierung, wie String.Format(IFormatProvider, String, Object[])
führt.
Die Datetime Klasse diese Schnittstelle implementiert, so ermöglicht es Ihnen, die Formatierung des Datetime Strings zu steuern.