Android – Mascara Monetária

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).

20 comentários em “Android – Mascara Monetária

  • 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.

  • 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?

  • 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!

  • 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

  • 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.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

 

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.