Markieren Sie das Kontrollkästchen Englisch, um die englische Version dieses Artikels anzuzeigen. Sie können den englischen Text auch in einem Popup-Fenster einblenden, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch
Diese Dokumentation wurde archiviert und wird nicht länger gepflegt.

IFormatProvider-Schnittstelle

Stellt einen Mechanismus für das Abrufen eines Objekts zur Steuerung der Formatierung bereit.

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

[ComVisibleAttribute(true)]
public interface IFormatProvider

Der IFormatProvider-Typ macht die folgenden Member verfügbar.

  NameBeschreibung
Öffentliche MethodeUnterstützt von XNA Frameworkefh2ww9y.PortableClassLibrary(de-de,VS.100).gifGetFormatGibt ein Objekt zurück, das Formatierungsdienste für den angegebenen Typ bereitstellt.
Zum Seitenanfang

Die IFormatProvider-Schnittstelle gibt ein Objekt an, das Formatierungsinformationen für Formatierungs- und Analysevorgänge bereitstellt. Mit Formatierungsvorgängen wird der Wert eines Typs in die Zeichenfolgendarstellung dieses Werts konvertiert. Typische Formatierungsmethoden sind die ToString-Methoden eines Typs sowie Format. Mit Analyseoperationen wird die Zeichenfolgendarstellung eines Werts in einen Typ mit diesem Wert konvertiert. Typische Analysemethoden sind Parse und TryParse.

Die IFormatProvider-Schnittstelle besteht aus einer einzigen Methode, IFormatProvider.GetFormat. GetFormat ist eine Rückrufmethode: Die Analyse- oder Formatierungsmethode ruft diese auf und übergibt an diese ein Type-Objekt, das den Typ von Objekt darstellt, von dem die Formatierungs- oder Analysemethode Formatierungsinformationen erwartet. Die GetFormat-Methode ist zuständig für das Zurückgeben eines Objekts dieses Typs.

IFormatProvider -Implementierungen werden implizit oft von Formatierungs- und Analysemethoden verwendet. Zum Beispiel verwendet die DateTime.ToString(String)-Methode implizit eine IFormatProvider-Implementierung, die die aktuelle Kultur des Systems darstellt. IFormatProvider -Implementierungen können auch explizit von Methoden angegeben werden, die über einen Parameter des Typs IFormatProvider verfügen, z. B. Int32.Parse(String, IFormatProvider) und String.Format(IFormatProvider, String, Object[]).

.NET Framework schließt die folgenden drei vordefinierten IFormatProvider-Implementierungen ein, um kulturspezifische Informationen bereitzustellen, die bei der Formatierung oder dem Analysieren von numerischen und Datums- und Uhrzeitwerten verwendet werden:

  • Die NumberFormatInfo-Klasse, die Informationen zum Formatieren von Zahlen bereitstellt, z. B. Währungssymbole oder Tausender- und Dezimaltrennzeichen für eine bestimmte Kultur.

  • Die DateTimeFormatInfo-Klasse, die Informationen bereitstellt, die verwendet werden, um Datumsangaben und Uhrzeiten zu formatieren, z. B. das Trennzeichen für Datums- und Zeitangabensymbole für eine bestimmte Kultur oder die Reihenfolge und die Form der Jahres-, Monats- und Tagkomponenten eines Datums.

  • Die CultureInfo-Klasse, die eine bestimmte Kultur darstellt. Die zugehörige GetFormat-Methode gibt ein kulturspezifisches NumberFormatInfo-Objekt oder DateTimeFormatInfo-Objekt zurück, je nachdem, ob das CultureInfo-Objekt in einer Formatierungs- oder Analyseoperation verwendet wird, die sich auf Zahlen oder Datumsangaben und Uhrzeiten bezieht.

.NET Framework unterstützt auch benutzerdefinierte Formatierung. Dies schließt meist die Erstellung einer Formatierungsklasse ein, die IFormatProvider und auch ICustomFormatter implementiert. Eine Instanz dieser Klasse wird dann als Parameter an eine Methode übergeben, die einen benutzerdefinierten Formatierungsvorgang ausführt, z. B. String.Format(IFormatProvider, String, Object[]). In dem Beispiel wird eine Abbildung so einer benutzerdefinierten Implementierung bereitgestellt, die eine Zahl als zwölfstellige Kontonummer formatiert.

Im folgenden Beispiel wird veranschaulicht, wie eine IFormatProvider-Implementierung die Darstellung eines Datums- und Uhrzeitwerts ändern kann. In diesem Fall wird ein einzelnes Datum mit CultureInfo-Objekten angezeigt, 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 Codebeispiel veranschaulicht die Verwendung einer Klasse, die die IFormatProvider-Schnittstelle und die GetFormat-Methode implementiert. Die AcctNumberFormat-Klasse konvertiert einen Int64-Wert, der eine Kontonummer darstellt, in eine formatierte Kontonummer mit 12 Ziffern. Die zugehörige GetFormat-Methode gibt einen Verweise auf die aktuelle AcctNumberFormat-Instanz zurück, wenn der formatType-Parameter auf eine Klasse verweist, die ICustomFormatter implementiert, andernfalls gibt GetFormatnull zurück.


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 IFormatProvider implementiert, kann anschließend in einem Aufruf eines Formatierungs- und Analysevorgangs verwendet werden. Im folgenden Code wird beispielsweise die String.Format(IFormatProvider, String, Object[])-Methode aufgerufen, 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.


.NET Framework

Unterstützt in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Unterstützt in:

Windows 7, Windows Vista SP1 oder höher, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core wird nicht unterstützt), Windows Server 2008 R2 (Server Core wird mit SP1 oder höher unterstützt), Windows Server 2003 SP2

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.
Anzeigen: