Pour afficher l’article en anglais, activez la case d’option Anglais. Vous pouvez aussi afficher la version anglaise dans une fenêtre contextuelle en faisant glisser le pointeur de la souris sur le texte.
Traduction
Anglais
Cette documentation est archivée et n’est pas conservée.

IFormatProvider, interface

Fournit un mécanisme permettant de récupérer un objet pour contrôler la mise en forme.

Espace de noms :  System
Assembly :  mscorlib (dans mscorlib.dll)

[ComVisibleAttribute(true)]
public interface IFormatProvider

Le type IFormatProvider expose les membres suivants.

  NomDescription
Méthode publiquePris en charge par XNA Frameworkefh2ww9y.PortableClassLibrary(fr-fr,VS.100).gifGetFormatRetourne un objet qui assure des services de mise en forme pour le type spécifié.
Début

L'interface IFormatProvider propose un objet qui fournit des information de mise en forme pour les opérations de mise en forme et d'analyse. Les opérations de mise en forme convertissent la valeur d'un type en une chaîne représentant cette valeur.
Les méthodes de mise en forme typiques sont les méthodes ToString d'un type, ainsi que Format. Les opérations d'analyse convertissent la chaine de caractères représentant une valeur dans un type contenant cette valeur. Les méthodes d'analyse typiques sont Parse et TryParse.

L'interface IFormatProvider se compose d'une méthode unique, IFormatProvider.GetFormat. GetFormat est une méthode de rappel : la méthode d'analyse ou de mise en forme l'appelle et lui passe un objet Type qui représente le type d'objet censé fournir les informations de mise en forme. La méthode GetFormat est chargée du retour d'un objet de ce type.

Les implémentations de IFormatProvider sont souvent utilisées implicitement par les méthodes de mise en forme et les méthodes d'analyse (de parsing).
Par exemple, la méthode DateTime.ToString(String) utilise implicitement une implémentation IFormatProvider qui représente la culture actuelle du système. Les implémentations IFormatProvider peuvent également être spécifiées explicitement par les méthodes qui ont un paramètre de type IFormatProvider, telles que Int32.Parse(String, IFormatProvider) et String.Format(IFormatProvider, String, Object[]).

Le .NET Framework inclut les trois implémentations IFormatProvider prédéfinies suivantes pour fournir des informations spécifiques à la culture utilisées pour la mise en forme ou l'analyse numérique et les valeurs de date et d'heure :

  • Classe NumberFormatInfo, qui fournit des informations qui permettent de mettre en forme des nombres, tels que les symboles de devise, de séparateur des milliers et de séparateur décimal, pour une culture spécifique.

  • Classe DateTimeFormatInfo qui fournit des informations utilisées pour mettre en forme les dates et les heures, notamment les symboles du séparateur de la date et de l'heure pour une culture particulière, ou l'ordre et le format des composants année, mois et jour d'une date.

  • Classe CultureInfo qui représente une culture particulière. Sa méthode GetFormat retourne un objet NumberFormatInfo ou DateTimeFormatInfo spécifique à la culture selon que l'objet CultureInfo est utilisé dans une opération de mise en forme ou d'analyse qui implique des nombres, des dates ou des heures.

Le .NET Framework prend également en charge la mise en forme personnalisée. Cela implique en général la création d'une classe de mise en forme qui implémente IFormatProvider et ICustomFormatter. Puis une instance de cette classe est passée comme paramètre à une méthode qui exécute une opération de mise en forme personnalisée, telle que String.Format(IFormatProvider, String, Object[]). L'exemple fournit une illustration d'une telle implémentation personnalisée qui met en forme un nombre comme un numéro de compte de 12 chiffres.

L'exemple suivant illustre comment une implémentation IFormatProvider peut modifier la représentation d'une valeur de date et d'heure. Dans ce cas, une date unique est affichée à l'aide des objets CultureInfo qui représentent quatre cultures différentes.


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


L'exemple suivant illustre l'utilisation d'une classe qui implémente l'interface IFormatProvider et la méthode GetFormat. La classe AcctNumberFormat convertit une valeur Int64 qui représente un numéro de compte en numéro de compte à 12 chiffres mis en forme. Sa méthode GetFormat retourne une référence à l'instance actuelle d'AcctNumberFormat si le paramètre formatType fait référence à une classe qui implémente ICustomFormatter ; sinon, GetFormat retourne 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;
   }
}


La classe qui implémente IFormatProvider peut ensuite être utilisée dans un appel à une opération de mise en forme et d'analyse. Par exemple, le code suivant appelle la méthode String.Format(IFormatProvider, String, Object[]) pour générer une chaîne qui contient un numéro de compte à 12 chiffres mis en forme.


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

Pris en charge dans : 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Pris en charge dans :

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
Afficher: