package br.com.concretesolutions.canarinho.formatador; /** * Formatador para CPF e CNPJ no mesmo campo. Formata como CPF até 11 dígitos numéricos. * Depois formata como CNPJ. * Ver exemplos no Sample. */ public final class FormatadorCPFCNPJ implements Formatador { private FormatadorCPFCNPJ() { } static FormatadorCPFCNPJ getInstance() { return SingletonHolder.INSTANCE; } @Override public String formata(final String value) { if (ehCpf(value)) { return Formatador.CPF.formata(value); } return Formatador.CNPJ.formata(value); } @Override public String desformata(final String value) { if (ehCpf(value)) { return Formatador.CPF.desformata(value); } return Formatador.CNPJ.desformata(value); } @Override public boolean estaFormatado(final String value) { if (ehCpf(value)) { return Formatador.CPF.estaFormatado(value); } return Formatador.CNPJ.estaFormatado(value); } @Override public boolean podeSerFormatado(final String value) { if (value == null) { return false; } if (ehCpf(value)) { return Formatador.CPF.podeSerFormatado(value); } return Formatador.CNPJ.podeSerFormatado(value); } private boolean ehCpf(String value) { if (value == null) { throw new IllegalArgumentException("Valor não pode ser nulo"); } final String desformatado = Formatador.Padroes.PADRAO_SOMENTE_NUMEROS.matcher(value).replaceAll(""); return desformatado.length() < 12; } private static class SingletonHolder { private static final FormatadorCPFCNPJ INSTANCE = new FormatadorCPFCNPJ(); } }