InputText - gravar somente números

Olá pessoal!

Na tela que criei há um campo que recebe tanto cpf quanto cnpj. Dependendo da quantidade de algarismos digitados, a máscara que inseri no inputText vai se comportar diferente. O problema é que, quando o cpf/cnpj é gravado, a máscara vai junto. Isso acaba me atrapalhando no momento de fazer uma pesquisa em um campo que pode receber tipos diferentes de dados. Se eu quiser fazer uma pesquisa por cpf e não pelo nome, por exemplo, terei que digitar também a máscara para que o registro seja encontrado.

Como faço então para que somente os números sejam gravados e a máscara do cpj ou do cnpj continue a ser exibida no nomento da digitação?

Segue abaixo a tela onde se encontra o campo de pesquisa e a configuração do inputText do JSF.

InputText:

<h:inputText class=“form-control” value="#{clienteBean.cliente.cpf_cnpj}" onkeyup=“mascara(this, cpfcnpj)” required=“true” requiredMessage=“Informe o cpf / cnpj do cliente” maxlength=“18”/>

Já tentou usar o método replace?

String cpf_cnpj = “123.456.789-00”;

cpf_cnpj = cpf_cnpj.replace(“.”,””).replace(“-“,””);

O método faz a troca de um item velho por um novo.

Olá Fábio!

Não conheço o método replace. Ele permite gravar só os números do cpf ou cnpj no banco sem a máscara? Porque é isso que eu preciso: que a máscara apareça no inputText quando o usuario digitar o cpf ou cnpj, mas na hora de gravar o dado no banco só vá os números.

Continua em String normalmente, e você terá apenas que fazer um cast.
Isso claro, depois que executar o método replace.
Ex:
int numero = Integer.parseInt(cpf_cnpj);

O replace é uma boa dica! Se estiver usando JPA pra persistir, crie um método void anotado com prePersist e preUpdate e coloque o replace no corpo desse método com base no atributo do tipo string que receberá o valor. Desta forma, esses listeners da JPA se encarregam de remover a máscara antes de inserir ou atualizar o valor do atributo no banco.

Não vou conseguir postar um código de exemplo pq estou no celular. Mas o caminho é usar a sugestão do replace com o PrePersist e PreUpdate dento da própria entidade

Poxa Raphael, se desse pra você postar um código, eu agradeceria muito. É que eu tô batendo cabeça com isso por não ser uma programadora experiente. Mas não quero abusar da tua boa vontade.

Acho que a marcação de code não vai ficar legal pelo celular, mas vamos ver como fica. Imagina que vc tem a classe Pessoa, que é uma entidade JPA válida, ok?! Vou pular a parte dos Getterse Setters, marcação de @Id, etc.

@Entity
 class Pessoa{

  @Column
  private String cnpjCpf;
  // getter e setter

  @PrePersist
  @PreUpdate
  public void tratarMascara(){
    If(cnpjCpf != null)
      this.cnpjCpf = this.cnpjCpf.replace(“.”, “”).replace(“/“, “”).replace(“-“,””);
  }

}

Bom, basicamente eu criei um método sem retorno que será responsável por remover a máscara de cnpj ou cpf, caso o atributo esteja preenchido. Essa validação é necessária para evitar um NPE.

As anotações PrePersist e PreUpdate são listeners da Jpa e vão fazer com que o método marcado com elas seja executado TODA vez que a entidade for persistida ou atualizada.

Strings são imutáveis e o método replace devolve uma String, por este motivo reatribui o valor do cnpjCpf.

PS: não tem necessidade alguma de converter o atributo em int pra gravar só os números, como foi citado. String são representadas no banco como varchar, logo, é um campo alfanumérico. É recomendado que vc faça o tratamento no inputText pra ele não receber letras ou aplicar uma validação de regex do valor no backend (mais trabalhoso)

public class Usuario {

private String cpfCnpj;

public void setCpfCnpj(String cpfCnpj) {
	this.cpfCnpj = cpfCnpj.replace(".", "").replace("-", "").replace("/", "");
}

public String getCpfCnpj() {
	return cpfCnpj;
}

}

Mais simples que isso impossível.
Métodos getter e setter não serve apenas para “enfeitar” a classe.