Formatando objetos utilizando IFormattable


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

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.

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.

 

Anúncios

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s