Saltar al contenido

¿Cómo formatear la entrada de EditText al escribir con separadores de miles (,) en Android?

Este enunciado ha sido evaluado por expertos para que tengas la garantía de la veracidad de nuestra esta noticia.

Solución:

Prueba este ejemplo:

import java.text.DecimalFormat;
import java.text.ParseException;

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

public class NumberTextWatcher implements TextWatcher 

    private DecimalFormat df;
    private DecimalFormat dfnd;
    private boolean hasFractionalPart;

    private EditText et;

    public NumberTextWatcher(EditText et)
    
        df = new DecimalFormat("#,###.##");
        df.setDecimalSeparatorAlwaysShown(true);
        dfnd = new DecimalFormat("#,###");
        this.et = et;
        hasFractionalPart = false;
    

    @SuppressWarnings("unused")
    private static final String TAG = "NumberTextWatcher";

    @Override
    public void afterTextChanged(Editable s)
    
        et.removeTextChangedListener(this);

        try 
            int inilen, endlen;
            inilen = et.getText().length();

            String v = s.toString().replace(String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()), "");
            Number n = df.parse(v);
            int cp = et.getSelectionStart();
            if (hasFractionalPart) 
                et.setText(df.format(n));
             else 
                et.setText(dfnd.format(n));
            
            endlen = et.getText().length();
            int sel = (cp + (endlen - inilen));
            if (sel > 0 && sel <= et.getText().length()) 
                et.setSelection(sel);
             else 
                // place cursor at the end?
                et.setSelection(et.getText().length() - 1);
            
         catch (NumberFormatException nfe) 
            // do nothing?
         catch (ParseException e) 
            // do nothing?
        

        et.addTextChangedListener(this);
    

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
    
    

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count)
    
        if (s.toString().contains(String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator())))
        
            hasFractionalPart = true;
         else 
            hasFractionalPart = false;
        
    


Para usarlo, agregue un TextChangedListener al componente EditText.

editText.addTextChangedListener(new NumberTextWatcher(editText));

Comentarios y puntuaciones del artículo

Más adelante puedes encontrar los informes de otros programadores, tú de igual forma eres capaz dejar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *