Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


EditText mostrando números con 2 decimales en todo momento

Me gustaría mostrar la entrada de los campos EditText con dos decimales en todo momento. Así que cuando el usuario ingrese 5 mostrará 5.00 o cuando el usuario ingrese 7.5 mostrará 7.50.

Además de eso también me gustaría mostrar cero cuando el campo está vacío en lugar de nada.

Lo que tengo ya es el tipo de entrada configurado para:

android:inputType="number|numberDecimal"/> 

¿Debo trabajar con filtros de entrada aquí?

Lo siento todavía bastante nuevo en android / java …

¡Gracias por tu ayuda!

Edit 2011-07-09 23.35 – Resuelto parte 1 de 2: El "" a 0.00.

Con la respuesta de nickfox pude resolver la mitad de mi pregunta.

  et.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) {} public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void onTextChanged(CharSequence s, int start, int before, int count) { if(s.toString().matches("")) { et.setText("0.00"); Selection.setSelection(et.getText(), 0, 4); } } }); 

Todavía estoy trabajando en una solución para la otra mitad de mi pregunta. Si encontré la solución lo publicaré aquí también.

Edit 2011-07-09 23.35 – Resuelto parte 2 de 2: Cambia la entrada del usuario a un número con dos decimales.

 OnFocusChangeListener FocusChanged = new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus){ String userInput = et.getText().toString(); int dotPos = -1; for (int i = 0; i < userInput.length(); i++) { char c = userInput.charAt(i); if (c == '.') { dotPos = i; } } if (dotPos == -1){ et.setText(userInput + ".00"); } else { if ( userInput.length() - dotPos == 1 ) { et.setText(userInput + "00"); } else if ( userInput.length() - dotPos == 2 ) { et.setText(userInput + "0"); } } } } 

  • ¿Cómo puedo configurar varios tipos de entrada en un EditText en Android?
  • 3 Solutions collect form web for “EditText mostrando números con 2 decimales en todo momento”

    Aquí hay algo que uso para la entrada del dólar. Se asegura de que sólo hay 2 lugares más allá del punto decimal en todo momento. Debe ser capaz de adaptarlo a sus necesidades eliminando el signo $.

      amountEditText.setRawInputType(Configuration.KEYBOARD_12KEY); amountEditText.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) {} public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void onTextChanged(CharSequence s, int start, int before, int count) { if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$")) { String userInput= ""+s.toString().replaceAll("[^\\d]", ""); StringBuilder cashAmountBuilder = new StringBuilder(userInput); while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') { cashAmountBuilder.deleteCharAt(0); } while (cashAmountBuilder.length() < 3) { cashAmountBuilder.insert(0, '0'); } cashAmountBuilder.insert(cashAmountBuilder.length()-2, '.'); cashAmountBuilder.insert(0, '$'); amountEditText.setText(cashAmountBuilder.toString()); // keeps the cursor always to the right Selection.setSelection(amountEditText.getText(), cashAmountBuilder.toString().length()); } } }); 

    Actualización # 2

    Corregirme si estoy equivocado, pero los documentos oficiales a TextWatcher dicen que es legítimo usar el método afterTextChanged para hacer cambios en … Contenido de EditText para esta tarea.

    Tengo la misma tarea en mi aplicación de idioma multy y como sé que es posible , o . Símbolos como el separador así que modifico la respuesta de nickfox para el formato 0.00 con el límite total de símbolos a 10:

    Diseño (Actualizado):

     <com.custom.EditTextAlwaysLast android:id="@+id/et" android:layout_height="wrap_content" android:layout_width="fill_parent" android:maxLength="10" android:layout_marginTop="50dp" android:inputType="numberDecimal" android:gravity="right"/> 

    EditTextAlwaysLast clase:

     import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.widget.EditText; /** * Created by Drew on 16-01-2015. */ public class EditTextAlwaysLast extends EditText { public EditTextAlwaysLast(Context context) { super(context); } public EditTextAlwaysLast(Context context, AttributeSet attrs) { super(context, attrs); } public EditTextAlwaysLast(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onSelectionChanged(int selStart, int selEnd) { //if just tap - cursor to the end of row, if long press - selection menu if (selStart==selEnd) setSelection(getText().length()); super.onSelectionChanged(selStart, selEnd); } } 

    Código en el método ocCreate (Actualización # 2):

     EditTextAlwaysLast amountEditText; Pattern regex; Pattern regexPaste; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); amountEditText = (EditTextAlwaysLast)findViewById(R.id.et); DecimalFormatSymbols dfs = new DecimalFormatSymbols(getResources().getConfiguration().locale); final char separator = dfs.getDecimalSeparator(); //pattern for simple input regex = Pattern.compile("^(\\d{1,7}["+ separator+"]\\d{2}){1}$"); //pattern for inserted text, like 005 in buffer inserted to 0,05 at position of first zero => 5,05 as a result regexPaste = Pattern.compile("^([0]+\\d{1,6}["+separator+"]\\d{2})$"); if (amountEditText.getText().toString().equals("")) amountEditText.setText("0"+ separator + "00"); amountEditText.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { if (!s.toString().matches(regex.toString())||s.toString().matches(regexPaste.toString())){ //Unformatted string without any not-decimal symbols String coins = s.toString().replaceAll("[^\\d]",""); StringBuilder builder = new StringBuilder(coins); //Example: 0006 while (builder.length()>3 && builder.charAt(0)=='0') //Result: 006 builder.deleteCharAt(0); //Example: 06 while (builder.length()<3) //Result: 006 builder.insert(0,'0'); //Final result: 0,06 or 0.06 builder.insert(builder.length()-2,separator); amountEditText.setText(builder.toString()); } amountEditText.setSelection(amountEditText.getText().length()); } public void beforeTextChanged(CharSequence s, int start, int count, int after) {} public void onTextChanged(CharSequence s, int start, int before, int count) { } }); } 

    Parece el mejor resultado para mí. Ahora, este código admite las acciones de copiar y pegar

    Sólo algunos cambios menores a las soluciones que patrick publicó. He implementado todo en el onFocusChangedListener. Asegúrese también de establecer el tipo de entrada EditText como "number | numberDecimal".

    Los cambios son: Si la entrada está vacía, reemplace con "0.00". Si la entrada tiene más de dos decimales de precisión, baje entonces a dos decimales. Algún refactoring menor.

     editText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { String userInput = ET.getText().toString(); if (TextUtils.isEmpty(userInput)) { userInput = "0.00"; } else { float floatValue = Float.parseFloat(userInput); userInput = String.format("%.2f",floatValue); } editText.setText(userInput); } } }); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.