Antes de mais nada, desculpem pela falta de tags apropriadas a este tópico: não me foram sugeridas as que sempre uso para estes casos (Primefaces e JSF). Algumas coisas mudaram desde a última vez que postei alguma dúvida.
Estou tentando de todo jeito fazer algo que um cliente me pediu e não estou conseguindo, mas é algo com cara de problema que alguém já resolveu: preciso fazer um inputMask com uma máscara dinâmica que, se a String estiver vazia ou for até do tamanho de um CPF, a máscara é de CPF. Se passar do 12o caracter, então a máscara precisa mudar para a de CNPJ. Não posso usar um Radio Button ou algo do gênero para trocar a renderização de input: o mecanismo precisa ser de acordo com quantidade
O método que atualiza a máscara não tem nada de mais: public void doUpdateInputCpfCnpj(AjaxBehaviorEvent event) { if (filtroVO == null || filtroVO.getCpfCnpj().length() < 12) { this.cpfCnpjMascara = "9?99.999.999-999"; } else { this.cpfCnpjMascara = "9?9.999.999/9999-99"; } }
Bem, isto não funciona porque o keypress faz o input ser atualizado a cada tecla que eu digito, ou seja: eu digito o primeiro caractere e ele apaga o que foi digitado.
Pessoal, esse tópico é muito antigo e eu solucionei a questão na época de um jeito que não era bem o que eu queria mas serviu. Basicamente eu defini como padrão uma máscara de CPF com três dígitos a mais sem serem obrigatórios (9?99.999.999-99999). Adicionei um listener com evento change para o campo com um método e verifica se foram digitados todos os dígitos da máscara, caso tenham sido ele altera a String com a máscara do campo para 9?9.999.999/9999-99.
Não fica do jeito que eu queria (acho que teria que ser feito com javascript mesmo… ou então fazer com keypress, mas acho loucura torrar chamada ao servidor para isso)… de qualquer forma, na época eu fiz isso e ninguém por aqui reclamou. rs
//<![CDATA[
function mascara(o, f) {
v_obj = o;
v_fun = f;
setTimeout("execmascara()", 1);
}
function execmascara() {
v_obj.value = v_fun(v_obj.value);
}
function valor(v) {
v = v.replace(/\D/g, "");
v = v.replace(/[0-9]{15}/, "Inválido");
v = v.replace(/(\d{1})(\d{11})$/, "$1.$2"); // coloca ponto antes dos
// últimos 11 digitos
v = v.replace(/(\d{1})(\d{8})$/, "$1.$2"); // coloca ponto antes dos
// últimos 8 digitos
v = v.replace(/(\d{1})(\d{5})$/, "$1.$2"); // coloca ponto antes dos
// últimos 5 digitos
v = v.replace(/(\d{1})(\d{1,2})$/, "$1,$2"); // coloca virgula antes dos
// últimos 2 digitos
return v;
}
function cpfCnpj(v) {
// Remove tudo o que não é dígito
v = v.replace(/\D/g, "");
v = v.replace(/[0-9]{15}/, "Inválido");
if (v.length == 11) { // CPF
// Coloca um ponto entre o terceiro e o quarto dígitos
v = v.replace(/(\d{3})(\d)/, "$1.$2");
// Coloca um ponto entre o terceiro e o quarto dígitos
// de novo (para o segundo bloco de números)
v = v.replace(/(\d{3})(\d)/, "$1.$2");
// Coloca um hífen entre o terceiro e o quarto dígitos
v = v.replace(/(\d{3})(\d{1,2})$/, "$1-$2");
} else { // CNPJ
// Coloca ponto entre o segundo e o terceiro dígitos
v = v.replace(/^(\d{2})(\d)/, "$1.$2");
// Coloca ponto entre o quinto e o sexto dígitos
v = v.replace(/^(\d{2})\.(\d{3})(\d)/, "$1.$2.$3");
// Coloca uma barra entre o oitavo e o nono dígitos
v = v.replace(/\.(\d{3})(\d)/, ".$1/$2");
// Coloca um hífen depois do bloco de quatro dígitos
v = v.replace(/(\d{4})(\d)/, "$1-$2");
}
return v
}
// ]]>