Este artículo se tradujo de forma manual. Mueva el puntero sobre las frases del artículo para ver el texto original.
Traducción
Original
Este tema aún no ha recibido ninguna valoración - Valorar este tema

IFormatProvider (Interfaz)

Proporciona un mecanismo para recuperar un objeto con el fin de controlar el formato.

Espacio de nombres:  System
Ensamblado:  mscorlib (en mscorlib.dll)
[ComVisibleAttribute(true)]
public interface IFormatProvider

El tipo IFormatProvider expone los siguientes miembros.

  Nombre Descripción
Método público Compatible con XNA Framework efh2ww9y.PortableClassLibrary(es-es,VS.100).gif GetFormat Devuelve un objeto que proporciona servicios de formato para el tipo especificado.
Arriba

La interfaz IFormatProvider proporciona un objeto que proporciona información del formato las operaciones de formato y análisis. Las 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 métodos ToString de un tipo, así como Format. Las operaciones de análisis convierten la representación de cadena de un valor en un tipo con ese valor. Los métodos de análisis típicos son Parse y TryParse.

La interfaz IFormatProvider se compone de un solo método, IFormatProvider.GetFormat. GetFormat es un método de devolución de llamada: el método de análisis o formato llama y pasa un objeto Type que representa el tipo de objeto que el método de análisis o formato espera que le proporcione información de formato. El método GetFormat es responsable de devolver un objeto de ese tipo.

Las implementaciones IFormatProvider suelen utilizarse implícitamente mediante métodos de formato y análisis. Por ejemplo, el método DateTime.ToString(String) utiliza una implementación IFormatProvider que representa la referencia cultural actual del sistema implícitamente. Las implementaciones IFormatProvider también se pueden especificar 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 tres implementaciones IFormatProvider predefinidas para proporcionar información específica de la referencia cultural que se utiliza para dar formato o analizar valores numéricos y de fecha y hora:

  • La clase NumberFormatInfo, que proporciona información que se usa para dar formato a los números, como los símbolos de divisa, separador de miles y separador decimal para una referencia cultural concreta.

  • La clase DateTimeFormatInfo, que proporciona información que se utiliza para dar formato a las fechas y horas, como los símbolos de separador de fecha y hora para una referencia cultural determinada o el orden y forma de los componentes de año, mes y día de una fecha.

  • La clase CultureInfo, que representa una referencia cultural determinada. Su método GetFormat devuelve objeto DateTimeFormatInfo o un NumberFormatInfo específico de la referencia cultural, dependiendo de si el objeto CultureInfo se utiliza en un formato u operación de análisis que implica números o fechas y horas.

.NET Framework también proporciona soporte técnico para el formato personalizado. Normalmente, esto implica la creación de una clase de formato que implementa IFormatProvider y ICustomFormatter. A continuación, una instancia de esta clase se pasa como un 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 de implementación personalizada como un número de cuenta de 12 dígitos.

En el siguiente ejemplo se muestra cómo una implementación IFormatProvider puede cambiar la representación de un valor de fecha y hora. En este caso, una fecha única se muestra utilizando objetos CultureInfo 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 siguiente ejemplo de código se muestra el uso de una clase que implementa la interfaz IFormatProvider y el método GetFormat. La clase AcctNumberFormat convierte un valor Int64 que representa un número de cuenta en un número de cuenta de 12 dígitos con formato. Su método GetFormat devuelve una referencia a la actual instancia de AcctNumberFormat si el parámetro formatType hace referencia a una clase que implemente ICustomFormatter; de lo 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 implemente IFormatProvider podrá usarse en una llamada a una operación de formato y análisis. Por ejemplo, el siguiente código llama al método String.Format(IFormatProvider, String, Object[]) 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.


.NET Framework

Compatible con: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Compatible con:

Windows 7, Windows Vista SP1 o posterior, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (no se admite Server Core), Windows Server 2008 R2 (se admite Server Core con SP1 o posterior), Windows Server 2003 SP2

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
¿Le ha resultado útil?
(Caracteres restantes: 1500)
Contenido de la comunidad Agregar