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:

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

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

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