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