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

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) {
   
}
}

`

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?

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

Sim… o BD está correto…

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

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

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

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.

Olá Boa tarde

Segue anexo

MaskMonetaria.java (1.4 KB)

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.

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!

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