MSDN.com | MSDN Brasil
imagem de enfeite imagem de enfeite

Artigo

Por Israel Aéce - Categoria: .NET - Data da Publicação: 10/01/2007 20:11:31


Formatando objetos utilizando IFormattable

Formatando objetos utilizando IFormattable

Já vimos e utilizamos várias vezes padrões de formatação que são fornecidos intrinsicamente pela infraestrutura do .NET Framework desde a sua versão 1.x. Esses padrões são comuns quando necessitamos formatar datas ou números, para exibirmos ao usuário um valor mais amigável e, alguns exemplos típicos estão neste artigo. Mas há situações em que precisamos formatar o nosso objeto customizado e, felizmente, o .NET Framework fornece uma interface chamada IFormattable qual possui um único método denominado, ToString qual é invocado automaticamente pelo runtime quando especificamos uma formatação.

Para o nosso cenário de exemplo, teremos dois objetos: Cliente e Cnpj. Cada cliente obrigatoriamente terá uma propriedade do tipo Cnpj. Este tipo por sua vez, implementará a interface IFormattable e deverá fornecer dois tipos de formatação: DF e PR. O primeiro significa "Documento Formatado" e retornará o valor do CNPJ formatado; já a segunda opção significa "PRefixo" e, se o usuário optar por este tipo de formatação, será retornado apenas o prefixo do CNPJ que, para quem não sabe, trata-se dos 9 primeiros dígitos. Vamos então montar a nossa arquitetura de classes que utilizaremos como exemplo:

public class Cliente
{
    private string _nome;
    private Cnpj _cnpj;

    public Cliente(string nome, string cnpj)
    {
        this._nome = nome;
        this._cnpj = new Cnpj(cnpj);
    }

    public string Nome
    {
        get
        {
            return this._nome;
        }
        set
        {
            this._nome = value;
        }
    }

    public Cnpj Cnpj
    {
        get
        {
            return this._cnpj;
        }
        set
        {
            this._cnpj = value;
        }
    }
}

public class Cnpj : IFormattable
{
    private string _numero;

    public Cnpj(string numero)
    {
        this._numero = numero;
    }

    public string ToString(string format, IFormatProvider formatProvider)
    {
        if (format == "DF")
            return
                Convert.ToDouble(this._numero).ToString(@"000\.000\.000\/0000\-00");
        else if (format == "PR")
            return
                Convert.ToDouble(this._numero.Substring(0, 9)).ToString(@"000\.000\.000");

        return this._numero;
    }

    public override string ToString()
    {
        return this.ToString(null, null);
    }
}
C# VB.NET  

Como podemos reparar, a classe Cliente tem uma propriedade chamada Cnpj do tipo Cnpj. O objeto Cnpj implementa a interface IFormattable e, dentro do método ToString, verifica qual o formato está sendo passado para ele. Baseando-se neste formato é que uma determinada formatação é aplicada ao número do CNPJ e, caso nenhuma formatação é especificada, somente o número é retornado, sem nenhuma espécie de formatação. Esse tipo de código nos permitirá fazer algo do tipo:

Cnpj c = new Cnpj("999999999999999");
Response.Write(string.Format("O documento formatado é {0:DF}.", c));
Response.Write(string.Format("O prefixo é {0:PR}.", c));
Response.Write(string.Format("O documento é {0}.", c));

// Output:

// O documento formatado é 999.999.999/9999-99.
// O prefixo é 999.999.999.
// O documento é 999999999999999.
C# VB.NET  

Esse tipo de formatação torna tudo muito flexível e, podemos ainda especificar o tipo de formatação em controles DataBound, como por exemplo o GridView do ASP.NET, da mesma forma que fazemos para datas e números. As imagens abaixo ilustram isso:

Figura 1 - Configuração da formatação no GridView.


2005. Projetando.NET.