Seguindo a série sobre Android, uma funcionalidade muito util para apps que precisam utilizar mascara monetária, basta seguir o seguinte código:
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 } } }
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 https://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