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. | |
