Ler em inglês

Compartilhar via


IFormatProvider Interface

Definição

Fornece um mecanismo para recuperar um objeto para controlar a formatação.

C#
public interface IFormatProvider
C#
[System.Runtime.InteropServices.ComVisible(true)]
public interface IFormatProvider
Derivado
Atributos

Exemplos

O exemplo a seguir ilustra como uma IFormatProvider implementação pode alterar a representação de um valor de data e hora. Nesse caso, uma única data é exibida usando CultureInfo objetos que representam quatro culturas diferentes.

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

O exemplo a seguir ilustra o uso de uma classe que implementa a IFormatProvider interface e o GetFormat método. A AcctNumberFormat classe converte um Int64 valor que representa um número de conta em um número de conta formatado de 12 dígitos. Seu GetFormat método retornará uma referência à instância atual AcctNumberFormat se o formatType parâmetro se referir a uma classe que implementa ICustomFormatter; caso contrário, GetFormat retornará null.

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;
   }
}

A classe que implementa IFormatProvider pode ser usada em uma chamada para uma operação de formatação e análise. Por exemplo, o código a seguir chama o String.Format(IFormatProvider, String, Object[]) método para gerar uma cadeia de caracteres que contém um número de conta formatado de 12 dígitos.

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.

Comentários

A IFormatProvider interface fornece um objeto que fornece informações de formatação para operações de formatação e análise. As operações de formatação convertem o valor de um tipo na representação de cadeia de caracteres desse valor. Métodos de formatação típicos são os ToString métodos de um tipo, bem como Format. As operações de análise convertem a representação de cadeia de caracteres de um valor em um tipo com esse valor. Métodos típicos de análise são Parse e TryParse.

A IFormatProvider interface consiste em um único método. IFormatProvider.GetFormat GetFormat é um método de retorno de chamada: o método de análise ou formatação o chama e passa um Type objeto que representa o tipo de objeto que o método de formatação ou análise espera fornecer informações de formatação. O GetFormat método é responsável por retornar um objeto desse tipo.

IFormatProvider as implementações geralmente são usadas implicitamente por métodos de formatação e análise. Por exemplo, o DateTime.ToString(String) método usa implicitamente uma implementação IFormatProvider que representa a cultura atual do sistema. IFormatProvider implementações também podem ser especificadas explicitamente por métodos que têm um parâmetro de tipo IFormatProvider, como Int32.Parse(String, IFormatProvider) e String.Format(IFormatProvider, String, Object[]).

O .NET Framework inclui as três implementações predefinidas IFormatProvider a seguir para fornecer informações específicas da cultura usadas na formatação ou na análise de valores numéricos e de data e hora:

O .NET Framework também dá suporte à formatação personalizada. Normalmente, isso envolve a criação de uma classe de formatação que implementa tanto quanto IFormatProvider ICustomFormatter. Uma instância dessa classe é então passada como um parâmetro para um método que executa uma operação de formatação personalizada, como String.Format(IFormatProvider, String, Object[]) O exemplo fornece uma ilustração de uma implementação personalizada que formata um número como um número de conta de 12 dígitos.

Métodos

GetFormat(Type)

Retorna um objeto que fornece serviços de formatação para o tipo especificado.

Aplica-se a

Produto Versões
.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

Confira também