Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Interfaz IFormatProvider

 

Publicado: octubre de 2016

Proporciona un mecanismo para recuperar un objeto que controle el formato.

Espacio de nombres:   System
Ensamblado:  mscorlib (en mscorlib.dll)

[ComVisibleAttribute(true)]
public interface IFormatProvider

NombreDescripción
System_CAPS_pubmethodGetFormat(Type)

Devuelve un objeto que proporciona servicios de formato para el tipo especificado.

El IFormatProvider interfaz proporciona un objeto que proporciona información de formato para dar formato y las operaciones de análisis. Operaciones de formato convierten el valor de un tipo en la representación de cadena de ese valor. Los métodos de formato típicos son los ToString métodos de un tipo, así como Format. Operaciones de análisis convierten la representación de cadena de un valor a un tipo con ese valor. Los métodos de análisis típicos son Parse y TryParse.

El IFormatProvider interfaz consta de un único método, IFormatProvider.GetFormat. GetFormat es un método de devolución de llamada: el análisis o método de formato llama y pasa un Type objeto que representa el tipo de objeto que espera el formato o analizar el método proporcionará información de formato. El GetFormat método es responsable de devolver un objeto de ese tipo.

IFormatProvider implementaciones suelen utilizarse implícitamente mediante métodos de análisis y formato. Por ejemplo, el DateTime.ToString(String) método utiliza implícitamente un IFormatProvider implementación que representa la referencia cultural actual del sistema. IFormatProvider implementaciones también pueden especificarse explícitamente mediante métodos con un parámetro de tipo IFormatProvider, como Int32.Parse(String, IFormatProvider) y String.Format(IFormatProvider, String, Object[]).

.NET Framework incluye las siguientes predefinidas IFormatProvider implementaciones para proporcionar información específica de la referencia cultural que se usa en formato o analizar valores numéricos y la fecha y hora:

.NET Framework también admite formatos personalizados. Normalmente, esto implica la creación de una clase de formato que las implementa IFormatProvider y ICustomFormatter. Una instancia de esta clase, a continuación, se pasa como parámetro a un método que realiza una operación de formato personalizada, como String.Format(IFormatProvider, String, Object[]) el ejemplo proporciona una ilustración de este tipo una implementación personalizada que da formato a un número como un número de cuenta de 12 dígitos.

En el ejemplo siguiente se muestra cómo un IFormatProvider implementación puede cambiar la representación de un valor de fecha y hora. En este caso, se muestra una sola fecha mediante CultureInfo objetos que representan cuatro referencias culturales diferentes.

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

En el ejemplo siguiente se muestra el uso de una clase que implementa el IFormatProvider interfaz y la GetFormat (método). La AcctNumberFormat clase convierte un Int64 valor que representa un número de cuenta en un número de cuenta de 12 dígitos con formato. Su GetFormat método devuelve una referencia a la actual AcctNumberFormat ejemplo, si la formatType parámetro hace referencia a una clase que implementa ICustomFormatter; en caso contrario, GetFormat devuelve 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 clase que implementa IFormatProvider puede usarse en una llamada a un formato y análisis de la operación. Por ejemplo, el siguiente código llama el String.Format(IFormatProvider, String, Object[]) método para generar una cadena que contiene un número de cuenta de 12 dígitos con formato.

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.

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 1.1
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: