Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

IFormatProvider-Schnittstelle

 

Veröffentlicht: Oktober 2016

Stellt einen Mechanismus zum Abrufen eines Objekts für die Formatierungssteuerung bereit.

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

[ComVisibleAttribute(true)]
public interface IFormatProvider

NameBeschreibung
System_CAPS_pubmethodGetFormat(Type)

Gibt ein Objekt, das Formatierungsdienste für den angegebenen Typ bereitstellt.

Die IFormatProvider Schnittstelle stellt ein Objekt, das Formatierungsinformationen für die Formatierung und Analyse von Operationen bereit. Formatierungsvorgängen konvertiert den Wert eines Typs in eine Zeichenfolgendarstellung des Werts. Normale Formatierungsmethoden sind die ToString Methoden eines Typs als auch Format. Analysevorgänge konvertiert die Zeichenfolgendarstellung eines Werts in einen Typ mit diesem Wert. Normale Analysemethoden sind Parse und TryParse.

Die IFormatProvider Schnittstelle besteht aus einer einzelnen Methode, IFormatProvider.GetFormat. GetFormat ist eine Rückrufmethode: die Analyse oder Formatierungsmethode aufgerufen und übergibt sie ein Type -Objekt, das den Typ des Objekts darstellt, das das Formatieren oder Analysieren der Methode erwartet werden Formatierungsinformationen bereitzustellen. Die GetFormat Methode ist verantwortlich für die Rückgabe eines Objekts dieses Typs.

IFormatProvider Implementierungen werden häufig implizit von Formatierung und Analyse von Methoden verwendet. Zum Beispiel die DateTime.ToString(String) -Methode verwendet implizit eine IFormatProvider Implementierung, die aktuelle Kultur des Systems darstellt. IFormatProvider Implementierungen können auch explizit durch Methoden, die über einen Parameter vom Typ angegeben werden IFormatProvider, wie z. B. Int32.Parse(String, IFormatProvider) und String.Format(IFormatProvider, String, Object[]).

.NET Framework enthält die folgenden drei vordefinierten IFormatProvider Implementierungen kulturspezifische Informationen angeben, die beim Formatieren oder analysieren numerische und Datums-und Uhrzeitwerte verwendet wird:

.NET Framework unterstützt auch benutzerdefinierte Formatierung. Dies schließt in der Regel die Erstellung einer Formatierungsklasse, die beide implementiert IFormatProvider und ICustomFormatter. Eine Instanz dieser Klasse wird dann als Parameter übergeben, um eine Methode, die einen benutzerdefinierten Formatierungsvorgang, wie z. B. ausführt String.Format(IFormatProvider, String, Object[]) im Beispiel veranschaulicht eine solche einer benutzerdefinierten Implementierung, die eine Zahl als Zahl 12 Ziffern formatiert.

Im folgende Beispiel wird veranschaulicht, wie ein IFormatProvider Implementierung kann die Darstellung eines Werts für Datum und Uhrzeit ändern. In diesem Fall wird ein einzelnes Datum angezeigt, mit CultureInfo Objekte, die vier verschiedene Kulturen darstellen.

using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      DateTime dateValue = new DateTime(2009, 6, 1, 4, 37, 0);
      CultureInfo[] cultures = { new CultureInfo("en-US"), 
                                 new CultureInfo("fr-FR"),
                                 new CultureInfo("it-IT"),
                                 new CultureInfo("de-DE") };
      foreach (CultureInfo culture in cultures)
         Console.WriteLine("{0}: {1}", culture.Name, dateValue.ToString(culture));
   }
}
// The example displays the following output:
//       en-US: 6/1/2009 4:37:00 PM
//       fr-FR: 01/06/2009 16:37:00
//       it-IT: 01/06/2009 16.37.00
//       de-DE: 01.06.2009 16:37:00

Das folgende Beispiel veranschaulicht die Verwendung einer Klasse, die implementiert die IFormatProvider Schnittstelle und die GetFormat Methode. Die AcctNumberFormat -Klasse konvertiert einen Int64 -Wert, der eine Kontonummer, um eine formatierte Kontonummer mit 12 Ziffern darstellt. Die GetFormat -Methode gibt einen Verweis auf die aktuelle AcctNumberFormat Instanz, wenn die formatType -Parameter verweist auf eine Klasse, die implementiert ICustomFormatterandernfalls GetFormat gibt null.

public class AcctNumberFormat : IFormatProvider, ICustomFormatter
{
   private const int ACCT_LENGTH = 12;

   public object GetFormat(Type formatType)
   {
      if (formatType == typeof(ICustomFormatter))
         return this;
      else
         return null;
   }

   public string Format(string fmt, object arg, IFormatProvider formatProvider) 
   {
      // Provide default formatting if arg is not an Int64.
      if (arg.GetType() != typeof(Int64))
         try {
            return HandleOtherFormats(fmt, arg); 
         }
         catch (FormatException e) {
            throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
         }

      // Provide default formatting for unsupported format strings.
      string ufmt = fmt.ToUpper(CultureInfo.InvariantCulture);
      if (! (ufmt == "H" || ufmt == "I")) 
         try {
            return HandleOtherFormats(fmt, arg);
         }
         catch (FormatException e) {
            throw new FormatException(String.Format("The format of '{0}' is invalid.", fmt), e);
         }

      // Convert argument to a string.
      string result = arg.ToString();

      // If account number is less than 12 characters, pad with leading zeroes.
      if (result.Length < ACCT_LENGTH)
         result = result.PadLeft(ACCT_LENGTH, '0');
      // If account number is more than 12 characters, truncate to 12 characters.
      if (result.Length > ACCT_LENGTH)
         result = result.Substring(0, ACCT_LENGTH);   

      if (ufmt == "I")                    // Integer-only format. 
         return result;
      // Add hyphens for H format specifier.
      else                                         // Hyphenated format.
         return result.Substring(0, 5) + "-" + result.Substring(5, 3) + "-" + result.Substring(8);
   }

   private string HandleOtherFormats(string format, object arg)
   {
      if (arg is IFormattable) 
         return ((IFormattable)arg).ToString(format, CultureInfo.CurrentCulture);
      else if (arg != null)
         return arg.ToString();
      else
         return String.Empty;
   }
}

Die Klasse, die implementiert IFormatProvider kann dann in einem Aufruf einer Formatierung und Analyse von Vorgang verwendet werden. Z. B. im folgenden code wird die String.Format(IFormatProvider, String, Object[]) Methode, um eine Zeichenfolge zu generieren, die eine formatierte Kontonummer mit 12 Ziffern enthält.

using System;
using System.Globalization;

public enum DaysOfWeek { Monday=1, Tuesday=2 };

public class TestFormatting
{
   public static void Main()
   {
      long acctNumber;
      double balance; 
      DaysOfWeek wday; 
      string output;

      acctNumber = 104254567890;
      balance = 16.34;
      wday = DaysOfWeek.Monday;

      output = String.Format(new AcctNumberFormat(), 
                             "On {2}, the balance of account {0:H} was {1:C2}.", 
                             acctNumber, balance, wday);
      Console.WriteLine(output);

      wday = DaysOfWeek.Tuesday;
      output = String.Format(new AcctNumberFormat(), 
                             "On {2}, the balance of account {0:I} was {1:C2}.", 
                             acctNumber, balance, wday);
      Console.WriteLine(output);
   }
}
// The example displays the following output:
//       On Monday, the balance of account 10425-456-7890 was $16.34.
//       On Tuesday, the balance of account 104254567890 was $16.34.

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1
Zurück zum Anfang
Anzeigen: