Seguindo a série sobre Android, uma funcionalidade muito util para apps que precisam utilizar mascara monetária, basta seguir o seguinte código:
[java]
package br.com.jbkr.exemplos;
import java.text.NumberFormat;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText valorMonetario = (EditText)findViewById(R.id.valorMonetario);
valorMonetario.addTextChangedListener(new MascaraMonetaria(valorMonetario));
}
private class MascaraMonetaria implements TextWatcher{
final EditText campo;
public MascaraMonetaria(EditText campo) {
super();
this.campo = campo;
}
private boolean isUpdating = false;
// Pega a formatacao do sistema, se for brasil R$ se EUA US$
private NumberFormat nf = NumberFormat.getCurrencyInstance();
@Override
public void onTextChanged(CharSequence s, int start, int before,
int after) {
// Evita que o método seja executado varias vezes.
// Se tirar ele entre em loop
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 {
// Transformamos o número que está escrito no EditText em
// monetário.
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) {
// Não utilizado
}
}
}
[/java]
Com os créditos ao Henrique Lacerda, precisei apenas fazer algumas alterações no código original para utilização em mais de um campo sem a necessidade de CTRL C + CTRL V, lembrem sempre do principio DRY(Don’t repeat yourself).
Olá cara, ela funciona realmente muito bem cara, parabéns, porém da de fazer uma boa melhoria ali se você trocar o seguinte pedaço de código.
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(“[.]”, “”);
}
por
String str = s.toString();
str = str.replaceAll(“[^\\d]”, “”);
o replaceAll retorna ele mesmo se não há uma mascara por exemplo, e está expressão regular remove tudo que não for número.
Boa Leonardo.
Cara, me ajuda com um detalhe pls, eu preciso pegar só o número, como eu faço para retirar o “R$”?
Está dando erro na hora de retirar a máscara, por incrível que pareça o método do autor do tópico Jean não funciona, nem o do Leonardo, ele não remove os caracteres.
E também para ficar visível a máscara é preciso digitar algum número primeiro.
Estou formatando 3 campos no formato de salário, mais ele me retorna com os caracteres especias, e preciso apenas dos números para poder fazer o calculo, como resolvo esse problema?
Quais caracteres especiais ? Qual versão do android vc esta usando ?
Eu consegui fazer aparecer correto a máscara, só faltava setar(inicializar) o campo em 0.0.
Agora o que eu preciso que ele me retorne um valor no formato tipo 1250.35 para poder fazer os cálculos necessários, quando eu faço com a máscara ele me retorna um int/double no formato R$1.250,35
Eu teria que limpar todos os caracteres especiais (R), ($), (.) e (.) e setor um ponto antes das ultimas duas casa, só que não estou conseguindo fazer isto.
Tens alguma dica?
Obrigado e parabéns pelo site!
Bom dia Moriantum,
Como você setou o campo para inicializar com valor 0.0? Também estou com dificuldades para retirar a máscara Jean para que eu possa executar os cálculos.
O valor deve ser setado na criação da Activity, no oncreate por exemplo.
Valeu Jean! Consegui setar o valor que eu queria. Só mais uma dúvida, tratamento do EditText para remoção da máscara ele é executado no onCreate ou no OnClickListener?
Não entendi sua duvida.
Boa noite Moriantum, é exatamente isso que terá de fazer, tratar o valor do campo antes de utiliza-lo para cálculos ou mesmo salvar no banco. Pode usar a seguinte função http://www.jbkr.com.br/geral/programacao-geral/java-programacao-geral/android-funcao-para-retirar-mascara-monetaria/
Help! Fiz, porém se altero o valor, tipo estava 10,00 e depois apenas tirei um zero 1,00, ao retornar e verificar o valor está 0,01??Alguém pode me ajudar, preciso muito solucionar!
aguardo
Muito bom!
Obrigado!
Esta deve ser a décima classe para isto que encontro, mas nada funciona, será que poderiam alterar o post colocando o texto final, conforme informações dos comentários? Do jeito que está, cheio de remendos, não quer funcionar
Muito bom o artigo, funcionou perfeito.
A minha dúvida é se ele funciona para todas as versões do Android.
Obrigado
Abraço.
em 2017 isso funcionou muito bem pra mim, depois de diversas tentativas de exemplos no stacker Owerflow, essa foi a unica que me solucionou o problema.
Não consigo retirar a mascara, podem ajudar?, o que faço para a mascar ficar 0.00 ?
Alguem teve problema com esse codigo no Android Pie?
Já conseguiu resolver ?
Eu estou com problema no android Pie