Auf Englisch lesen

Teilen über


IFormatProvider Schnittstelle

Definition

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

C#
public interface IFormatProvider
C#
[System.Runtime.InteropServices.ComVisible(true)]
public interface IFormatProvider
Abgeleitet
Attribute

Beispiele

Im folgenden Beispiel wird veranschaulicht, wie eine IFormatProvider Implementierung die Darstellung eines Datums- und Uhrzeitwerts ändern kann. In diesem Fall wird ein einzelnes Datum mithilfe CultureInfo von Objekten angezeigt, die vier verschiedene Kulturen darstellen.

C#
using System;
using System.Globalization;

public class Example
{
   public static void Main()
   {
      DateTime dateValue = new DateTime(2009, 6, 1, 16, 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

Im folgenden Beispiel wird die Verwendung einer Klasse veranschaulicht, die die IFormatProvider Schnittstelle und die GetFormat Methode implementiert. Die AcctNumberFormat Klasse konvertiert einen Wert, der eine Int64 Kontonummer in eine formatierte 12-stellige Kontonummer darstellt. Die GetFormat Methode gibt einen Verweis auf die aktuelle AcctNumberFormat Instanz zurück, wenn der formatType Parameter auf eine Klasse verweist, die implementiert wird; andernfalls ICustomFormatterGetFormat wird zurückgegebennull.

C#
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 wird, kann dann in einem Aufruf zu einem Formatierungs IFormatProvider - und Analysevorgang verwendet werden. Der folgende Code ruft beispielsweise die Methode auf, um eine Zeichenfolge zu generieren, die String.Format(IFormatProvider, String, Object[]) eine formatierte 12-stellige Kontonummer enthält.

C#
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.

Hinweise

Die IFormatProvider Schnittstelle stellt ein Objekt bereit, das Formatierungsinformationen für Formatierungs- und Analysevorgänge bereitstellt. Formatierungsvorgänge konvertieren den Wert eines Typs in die Zeichenfolgendarstellung dieses Werts. Typische Formatierungsmethoden sind die ToString Methoden eines Typs sowie Format. Die Analysevorgänge konvertieren die Zeichenfolgendarstellung eines Werts in einen Typ mit diesem Wert. 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 sie auf und übergibt es ein Type Objekt, das den Typ des Objekts darstellt, den die Formatierungs- oder Analysemethode erwartet, formatierungsinformationen bereitstellt. Die GetFormat Methode ist dafür verantwortlich, ein Objekt dieses Typs zurückzugeben.

IFormatProvider Implementierungen werden häufig implizit durch Formatierung und Analysemethoden verwendet. Die Methode verwendet beispielsweise DateTime.ToString(String) implizit eine IFormatProvider Implementierung, die die aktuelle Kultur des Systems darstellt. IFormatProvider Implementierungen können auch explizit durch Methoden angegeben werden, die einen Parameter vom Typ IFormatProviderhaben, z Int32.Parse(String, IFormatProvider) . B. und String.Format(IFormatProvider, String, Object[]).

Die .NET Framework enthält die folgenden drei vordefinierten IFormatProvider Implementierungen, um kulturspezifische Informationen bereitzustellen, die in der Formatierung oder Analyse numerischer und Datums- und Uhrzeitwerte verwendet werden:

Die .NET Framework unterstützt auch benutzerdefinierte Formatierungen. Dies umfasst in der Regel die Erstellung einer Formatierungsklasse, die sowohl IFormatProvider ICustomFormatterals auch . Eine Instanz dieser Klasse wird dann als Parameter an eine Methode übergeben, die einen benutzerdefinierten Formatierungsvorgang ausführt, z String.Format(IFormatProvider, String, Object[]) . B. Das Beispiel stellt eine Abbildung einer solchen benutzerdefinierten Implementierung bereit, die eine Zahl als 12-stellige Kontonummer formatiert.

Methoden

GetFormat(Type)

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

Gilt für

Produkt Versionen
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Siehe auch