Cet article a fait l'objet d'une traduction automatique. Déplacez votre pointeur sur les phrases de l'article pour voir la version originale de ce texte. Informations supplémentaires.
Traduction
Source
Ce sujet n'a pas encore été évalué - Évaluez ce sujet

Comment : définir et utiliser des fournisseurs de format numérique personnalisés

Le .NET Framework vous donne un contrôle étendu sur la représentation sous forme de chaîne de valeurs numériques. Il prend en charge les fonctionnalités suivantes pour personnaliser le format des valeurs numériques :

  • Chaînes de format numériques standard, qui fournissent un ensemble prédéfini de formats de conversion des nombres en leur représentation sous forme de chaîne. Vous pouvez les utiliser avec toute numérique mise en forme de méthode, telle que Decimal.ToString(String), qui a un format paramètre. Pour plus d'informations, consultez Chaînes de format numériques standard.

  • Chaînes de format numériques personnalisées, qui fournissent un jeu de symboles qui peuvent être combinés pour définir des spécificateurs de format numérique personnalisé. Ils peuvent également être utilisés avec n'importe quel numérique mise en forme de méthode, telle que Decimal.ToString(String), qui a un format paramètre. Pour plus d'informations, consultez Chaînes de format numériques personnalisées.

  • Personnalisé [.CultureInfo] ou [:System.Globalization.NumberFormatInfo] objets qui définissent les symboles et modèles utilisés pour afficher les représentations sous forme de chaîne de valeurs numériques de format. Vous pouvez les utiliser avec toute numérique mise en forme de méthode, telle que ToString, qui a un fournisseur paramètre. En règle générale, le fournisseur paramètre est utilisé pour spécifier la mise en forme spécifiques à la culture.

Dans certains cas (par exemple, lorsqu'une application doit afficher un numéro de compte mis en forme, un numéro d'identification ou un code postal), ces trois techniques sont inappropriés. Le .NET Framework vous permet également de définir un objet de mise en forme qui n'est ni un [.CultureInfo] ni un [:System.Globalization.NumberFormatInfo] objet à une valeur numérique est mise en forme. Cette rubrique fournit des instructions détaillées de mise en oeuvre d'un tel objet et fournit un exemple qui met en forme les numéros de téléphone.

Pour définir un fournisseur de format personnalisé

  1. Définissez une classe qui implémente le IFormatProvider et ICustomFormatter interfaces.

  2. Mettre en œuvre le [.GetFormat(System.Type)] méthode. [.GetFormat(System.Type)] est une méthode de rappel que la méthode de mise en forme (telle que la String.Format(IFormatProvider, String, Object[]) méthode) appelle pour récupérer l'objet qui est réellement chargé d'effectuer la mise en forme personnalisée. Une implémentation typique de [.GetFormat(System.Type)] effectue les opérations suivantes :

    1. Détermine si le type objet passé en tant que méthode paramètre représente un ICustomFormatter interface.

    2. Si le paramètre ne représente pas la ICustomFormatter interface, [.GetFormat(System.Type)] Renvoie un objet qui implémente le ICustomFormatter interface qui est chargé de fournir la mise en forme personnalisée. En règle générale, l'objet de mise en forme personnalisée se retourne elle-même.

    3. Si le paramètre ne représente pas la ICustomFormatter interface, [.GetFormat(System.Type)] Retourne null.

  3. Mettre en œuvre le Format méthode. Cette méthode est appelée par le String.Format(IFormatProvider, String, Object[]) méthode et est chargée de retourner la représentation sous forme de chaîne d'un nombre. Implémentation de la méthode généralement implique les tâches suivantes :

    1. Le cas échéant, assurez-vous que la méthode est légitimement destinée à fournir des services de mise en forme en examinant la fournisseur paramètre. Pour mettre en forme des objets qui implémentent les deux IFormatProvider et ICustomFormatter, vous devez tester le fournisseur égalité avec l'objet en cours de mise en forme du paramètre.

    2. Déterminez si l'objet de mise en forme doit prendre en charge des spécificateurs de format personnalisés. (Par exemple, un "N" spécificateur de format peut indiquer que U.S. numéro de téléphone doit être sortie au format NANP et un « I » peut indiquer une sortie au format ITU-T Recommendation E.123.) Si les spécificateurs de format sont utilisés, la méthode doit gérer le spécificateur de format spécifique. Il est passé à la méthode dans le format paramètre. Si aucun spécificateur n'est présent, la valeur de la format le paramètre est [.Empty].

    3. Récupérer la valeur numérique passée à la méthode en tant que le arg paramètre. Effectuez les opérations requises pour le convertir en sa représentation sous forme de chaîne.

    4. Retourner la représentation sous forme de chaîne de la arg paramètre.

Pour utiliser un objet de mise en forme numérique personnalisé

  1. Créer une nouvelle instance de la classe de mise en forme personnalisée.

  2. Appelez le String.Format(IFormatProvider, String, Object[]) méthode de mise en forme, en lui passant l'objet de mise en forme personnalisée, le spécificateur de mise en forme (ou [.Empty]Si elle n'est pas utilisée) et la valeur numérique à mettre en forme.

L'exemple suivant définit un fournisseur de format numérique personnalisé nommé TelephoneFormatter qui convertit un nombre qui représente un U.S. téléphone au format NANP ou E.123. La méthode gère deux spécificateurs de format « N » (qui renvoie au format NANP) et « I » (qui renvoie au format E.123 international).


using System;
using System.Globalization;

public class TelephoneFormatter : IFormatProvider, ICustomFormatter
{
   public object GetFormat(Type formatType)
   {
      if (formatType == typeof(ICustomFormatter))
         return this;
      else
         return null;
   }               

   public string Format(string format, object arg, IFormatProvider formatProvider)
   {
      // Check whether this is an appropriate callback             
      if (! this.Equals(formatProvider))
         return null; 

      // Set default format specifier             
      if (string.IsNullOrEmpty(format)) 
         format = "N";

      string numericString = arg.ToString();

      if (format == "N")
      {
         if (numericString.Length <= 4)
            return numericString;
         else if (numericString.Length == 7)
            return numericString.Substring(0, 3) + "-" + numericString.Substring(3, 4); 
         else if (numericString.Length == 10)
               return "(" + numericString.Substring(0, 3) + ") " +
                      numericString.Substring(3, 3) + "-" + numericString.Substring(6);   
         else
            throw new FormatException( 
                      string.Format("'{0}' cannot be used to format {1}.", 
                                    format, arg.ToString()));
      }
      else if (format == "I")
      {
         if (numericString.Length < 10)
            throw new FormatException(string.Format("{0} does not have 10 digits.", arg.ToString()));
         else
            numericString = "+1 " + numericString.Substring(0, 3) + " " + numericString.Substring(3, 3) + " " + numericString.Substring(6);
      }
      else
      {
         throw new FormatException(string.Format("The {0} format specifier is invalid.", format));
      } 
      return numericString;  
   }
}

public class TestTelephoneFormatter
{
   public static void Main()
   {
      Console.WriteLine(String.Format(new TelephoneFormatter(), "{0}", 0));
      Console.WriteLine(String.Format(new TelephoneFormatter(), "{0}", 911));
      Console.WriteLine(String.Format(new TelephoneFormatter(), "{0}", 8490216));
      Console.WriteLine(String.Format(new TelephoneFormatter(), "{0}", 4257884748));

      Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:N}", 0));
      Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:N}", 911));
      Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:N}", 8490216));
      Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:N}", 4257884748));

      Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:I}", 4257884748));
   }
}


Le fournisseur de format numérique personnalisé peut être utilisé uniquement avec le String.Format(IFormatProvider, String, Object[]) méthode. Les autres surcharges de la mise en forme (telles que les méthodes numérique ToString) qui ont un paramètre de type IFormatProvider passent toutes les [.GetFormat(System.Type)] mise en œuvre un type objet qui représente la [:System.Globalization.NumberFormatInfo] type. En retour, normalement, la méthode pour retourner un [:System.Globalization.NumberFormatInfo] objet. Si elle n'est pas le cas, le fournisseur de format numérique personnalisé est ignoré et le [:System.Globalization.NumberFormatInfo] objet pour la culture actuelle est utilisé à sa place. Dans l'exemple, le TelephoneFormatter.GetFormat méthode gère le risque qui peut être inapproprié passé à la valeur numérique mise en forme de la méthode en examinant le paramètre de méthode et en retournant null s'il représente un type autre que ICustomFormatter.

Si un fournisseur de format numérique personnalisé prend en charge un jeu de spécificateurs de format, vérifiez que vous fournissez un comportement par défaut si aucun spécificateur de format n'est fourni dans l'élément de format utilisé dans le String.Format(IFormatProvider, String, Object[]) appel de méthode. Dans l'exemple, « N » est le spécificateur de format par défaut. Ainsi, pour un nombre à convertir en un numéro de téléphone mis en forme en fournissant un spécificateur de format explicite. L'exemple suivant illustre un appel de méthode.


Console.WriteLine(String.Format(new TelephoneFormatter(), "{0:N}", 4257884748));


Mais il permet également la conversion se produit si aucun spécificateur de format n'est présent. L'exemple suivant illustre un appel de méthode.


Console.WriteLine(String.Format(new TelephoneFormatter(), "{0}", 4257884748));


Si aucun spécificateur de format par défaut n'est défini, votre implémentation de la ICustomFormatter.Format méthodes doivent inclure le code suivant afin que le.NET Framework puisse fournir que votre code ne prend pas en charge la mise en forme.


if (arg is IFormattable) 
   s = ((IFormattable)arg).ToString(format, formatProvider);
else if (arg != null)    
   s = arg.ToString();


Dans cet exemple, la méthode qui implémente ICustomFormatter.Format est destiné à servir de méthode de rappel pour le String.Format(IFormatProvider, String, Object[]) méthode. Par conséquent, il examine la formatProvider paramètre pour déterminer s'il contient une référence à l'actuel TelephoneFormatter objet. Toutefois, la méthode peut également être appelée directement à partir du code. Dans ce cas, vous pouvez utiliser le formatProvider paramètre pour fournir un [.CultureInfo] ou [:System.Globalization.NumberFormatInfo] objet qui fournit des informations de mise en forme spécifiques à la culture.

Compilez le code à la ligne de commande à l'aide de csc.exe ou vb.exe. Pour compiler le code dans Visual Studio, placez-le dans un modèle de projet application console.

Cela vous a-t-il été utile ?
(1500 caractères restants)

Ajouts de la communauté

AJOUTER
© 2013 Microsoft. Tous droits réservés.