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) {
}
}
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?
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
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á… 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.
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.