Máscara monetária salva com dígitos certos mas quando retorna faltam dois dígitos

11 respostas
java
E

Estou com um problema na minha máscara monetária. Tenho um cadastro de produtos, após salvar o produto com os valores certos quando eu chamo o produto para a tela de cadastro novamente ele retorna com dois dígitos a menos. Por exemplo: Quando eu salvo R$ 200,00 e chamo o produto na tela de cadastro ele retorna R$ 2,00. Alguém pode ajudar ? Obrigado.

`public class MonetaryMask implements TextWatcher { 

 final EditText campo;

public static double stringMonetarioToDouble(String str) {
    double retorno = 0;
    try {
        boolean hasMask = ((str.indexOf("R$") > -1 || str.indexOf("$") > -1) && (str
                .indexOf(".") > -1 || str.indexOf(",") > -1));
        if (hasMask) {
            str = str.replaceAll("[R$]", "").replaceAll("\\,\\w+", "")
                    .replaceAll("\\.\\w+", "");
        }

        retorno = Double.parseDouble(str);
    } catch (NumberFormatException e) {
        //TRATAR EXCEÇÃO
    }
    return retorno;
}


 public MonetaryMask(EditText campo) {
    super();
    this.campo = campo;
  }

     private boolean isUpdating = false;

     private NumberFormat nf = NumberFormat.getCurrencyInstance();

   @Override
   public void onTextChanged(CharSequence s, int start, int before,
        int after) {

 
      if (isUpdating) {
        isUpdating = false;
        return;
    }

    isUpdating = true;
    String str = s.toString();
    // Verifica se já existe a máscara no texto.
    boolean hasMask = ((str.indexOf("R$") > -1 || str.indexOf("$") > -1)
            && (str.indexOf(".") > -1 || str.indexOf(",") > -1));
    // Verificamos se existe máscara
    if (hasMask) {
        // Retiramos a máscara.
        str = str.replaceAll("[R$]", "").replaceAll("[,]", "")
                .replaceAll("[.]", "");
    }

    try {

        str = nf.format(Double.parseDouble(str) / 100);
        campo.setText(str);
        campo.setSelection(campo.getText().length());
    } catch (NumberFormatException e) {
        s = "";
    }
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
        int after) {
    // Não utilizado
}

@Override
public void afterTextChanged(Editable s) {
   
}
}

`

11 Respostas

R

Eduardo bom dia.

Então pelo visto estamos com problemas porque estamos fazendo uso da mascara, acredito que estamos utilizando a mesma eu obtive o código ontem apos pesquisar por ele, bem você descreveu que “apos salvar o produto com os valores certos” você quer dizer que consultando no banco o valor esta correto? porque eu estou com problemas antes de salvar no banco porque eu faço o calculo do valor total multiplicando a quantidade pelo valor unitário fazendo uso dos métodos da classe Bigdecimal para multiplicar por conta de sua precisão , bem observo no logcat que o resultado da divisão esta correto mais quando coloco o valor no editText sempre vem errado, tipo se multiplico 0,2 * 100 = 20,00 mais no editText usando a formatação vem R$ 2,00

Também tô correndo atras disto porque é apenas esta tela que preciso resolver, mais vc já olhou no banco se o teu dado esta correto?

R

Cara fiquei olhando o código que faz a mascara, e meu estranho o lance de dividir por 100
isso esta causando tudo isso vamos ver

double value = (Double.parseDouble(str) / 100);

imagina o estrago que isso faz e a variável str não tiver limpa ou seja livre de pontos, virgulas ou seja precisamos limpar isso

Então eu comentei e inseri veja o código abaixo como ficou:

`
//boolean hasMask = ((str.indexOf(“R$”) > -1 || str.indexOf("$") > -1) && (str.indexOf(".") > -1 || str.indexOf(",") > -1));

//if (hasMask) {
//    str = MaskMonetaria.unmask(s.toString());
//}
str = str.replaceAll("[^\\d]", "");

String mascara = "";
            try {

`

Isso esta descrito nos comentarios feito pelo Leonardo Rossetto no site
Clique aqui no Link do site

E

Sim… o BD está correto…

E

Cara eu fiz aqui e quase deu certo… porém antes estava faltando dois dígitos…agora somente um… como ficou o teu ??

R

Olá boa tarde!

Bem o meu já para começo de conversa o valor unitário do produto vindo do banco exemplo 4,45 mostrava 0,04

Removi aquele trecho do código, aquele que verificava se existia a mascara, e independente se tem ou não mascara o str = str.replaceAll("[^\d]", “”) remove tudo, quando chega no double value = (Double.parseDouble(str) / 100) a variavel str esta limpa então é aplicado a mascara, agora ao invés de 0,04 agora vem o valor certo ou seja R$ 4,45

E

humm… vou rever o meu código aqui então… o meu resolveu parcialmente… :confounded:

E

Cara, ainda não consegui resolver aqui… tem como tu me passar tua classe de máscara para eu comprar com a minha aqui e fazer alguns testes ? Se puder eu agradeço muito.

R

Olá Boa tarde

Segue anexo

MaskMonetaria.java (1.4 KB)

E

Olá… Desde já agradeço… fiz alguns testes aqui…usei tua máscara no meu projeto. Não sei porque razão agora ele está incluindo um dígito a mais…vou continuar pesquisando aqui… de qualquer forma muito Obrigado.

R

Olá Bom dia!

Fico feliz de ter contribuído muito embora o mérito não é meu, se você observar o conteúdo na net que fala sobre o assunto verá que o pessoal tem comentado sobre o mesmo problema que eu e você estávamos tendo.

Um Abraço!

E

Bom dia.
Sim… eu observei isso. O primeiro que conseguir ajustar avisa aqui então. Abraço e obrigado.

Criado 19 de janeiro de 2016
Ultima resposta 20 de jan. de 2016
Respostas 11
Participantes 2