package br.com.concretesolutions.canarinho.formatador; import java.util.regex.Pattern; /** */ public final class FormatadorTelefone implements Formatador { private static final Pattern NOVE_DIGITOS_FORMATADO = Pattern .compile("\\((\\d{2})\\)\\s(\\d{5})-(\\d{4})"); private static final Pattern NOVE_DIGITOS_DESFORMATADO = Pattern .compile("(\\d{2})(\\d{5})(\\d{4})"); private static final FormatadorBase FORMATADOR_NOVE_DIGITOS = new FormatadorBase(NOVE_DIGITOS_FORMATADO, "($1) $2-$3", NOVE_DIGITOS_DESFORMATADO, "$1$2$3"); private static final Pattern OITO_DIGITOS_FORMATADO = Pattern .compile("\\((\\d{2})\\)\\s(\\d{4})-(\\d{4})"); private static final Pattern OITO_DIGITOS_DESFORMATADO = Pattern .compile("(\\d{2})(\\d{4})(\\d{4})"); private static final FormatadorBase FORMATADOR_OITO_DIGITOS = new FormatadorBase(OITO_DIGITOS_FORMATADO, "($1) $2-$3", OITO_DIGITOS_DESFORMATADO, "$1$2$3"); private FormatadorTelefone() { } static FormatadorTelefone getInstance() { return SingletonHolder.INSTANCE; } @Override public String formata(String value) { if (ehNoveDigitos(value)) { return FORMATADOR_NOVE_DIGITOS.formata(value); } return FORMATADOR_OITO_DIGITOS.formata(value); } @Override public String desformata(String value) { if (ehNoveDigitos(value)) { return FORMATADOR_NOVE_DIGITOS.desformata(value); } return FORMATADOR_OITO_DIGITOS.desformata(value); } @Override public boolean estaFormatado(String value) { if (ehNoveDigitos(value)) { return FORMATADOR_NOVE_DIGITOS.estaFormatado(value); } return FORMATADOR_OITO_DIGITOS.estaFormatado(value); } @Override public boolean podeSerFormatado(String value) { if (ehNoveDigitos(value)) { return FORMATADOR_NOVE_DIGITOS.podeSerFormatado(value); } return FORMATADOR_OITO_DIGITOS.podeSerFormatado(value); } private boolean ehNoveDigitos(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() > 10; } private static class SingletonHolder { private static final FormatadorTelefone INSTANCE = new FormatadorTelefone(); } }