Formato EditarTexto a moneda con números enteros

All- Tengo un TextWatcher que formatea un EditText al formato de la modernidad:

 private String current = ""; public void onTextChanged(CharSequence s, int start, int before, int count) { if(!s.toString().equals(current)){ editText$.removeTextChangedListener(this); String cleanString = s.toString().replaceAll("[$,.]", ""); double parsed = Double.parseDouble(cleanString); String formated = NumberFormat.getCurrencyInstance().format((parsed/100)); current = formated; editText$.setText(formated); editText$.setSelection(formated.length()); editText$.addTextChangedListener(this); } } 

Esto funciona muy bien, el problema es que mi EditText sólo necesita números enteros por lo que no el usuario a ser capaz de introducir centavos. Así que en lugar de 0.01 que 0.12 que 1.23 de 12.34, quiero 1 de 12 que 123 que 1.234. ¿Cómo puedo deshacerme del punto decimal, pero mantener las comas? Gracias.

Si no te importa eliminar el punto y los ceros finales, puedes hacer esto:

  mEditText.addTextChangedListener(new TextWatcher() { private String current = ""; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (!s.toString().equals(current)) { annualIncomeEntry.removeTextChangedListener(this); String cleanString = s.toString().replaceAll("[$,]", ""); if (cleanString.length() > 0) { double parsed = Double.parseDouble(cleanString); NumberFormat formatter = NumberFormat.getCurrencyInstance(); formatter.setMaximumFractionDigits(0); current = formatter.format(parsed); } else { current = cleanString; } annualIncomeEntry.setText(current); annualIncomeEntry.setSelection(current.length()); annualIncomeEntry.addTextChangedListener(this); } } @Override public void afterTextChanged(Editable s) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } }); 

Esto establecerá los dígitos de fracción máxima del formateador de números a cero, eliminando todos los ceros finales y el período. También quité la división por 100 de modo que todos los números introducidos sean enteros.

También asegúrese de que el InputType de su EditText es "number" o esto se bloqueará si el usuario intenta ingresar un carácter no numérico.

La respuesta de Hexar fue útil pero carecía de detección de errores cuando el usuario eliminaba todos los números o movía el cursor. He construido sobre su respuesta y una respuesta aquí para formar una solución completa. Puede que no sea la mejor práctica debido a establecer el EditText en el método onTextChanged (), pero funciona.

  /* don't allow user to move cursor while entering price */ mEditText.setMovementMethod(null); mEditText.addTextChangedListener(new TextWatcher() { private String current = ""; NumberFormat formatter = NumberFormat.getCurrencyInstance(); private double parsed; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (!s.toString().equals(current)) { /* remove listener to prevent stack overflow from infinite loop */ mEditText.removeTextChangedListener(this); String cleanString = s.toString().replaceAll("[$,]", ""); try { parsed = Double.parseDouble(cleanString); } catch(java.lang.NumberFormatException e) { parsed = 0; } formatter.setMaximumFractionDigits(0); String formatted = formatter.format(parsed); current = formatted; mEditText.setText(formatted); /* add listener back */ mEditText.addTextChangedListener(this); /* print a toast when limit is reached... see xml below. * this is for 6 chars */ if (start == 7) { Toast toast = Toast.makeText(getApplicationContext(), "Maximum Limit Reached", Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); } } } 

Una manera rápida de asegurar que el usuario no ingrese información no válida es editar el xml. Para mi programa, se estableció un límite de 6 caracteres numéricos.

  <!-- it says maxLength 8 but it's really 6 digits and a '$' and a ',' --> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="number|textVisiblePassword" android:maxLength="8" android:digits="0123456789" android:id="@+id/mEditText" android:hint="Price"/> 

¿Por qué no formatear la cantidad usando currencyFormat y luego sacar el .00 de la cadena.

 private static final ThreadLocal<NumberFormat> currencyFormat = new ThreadLocal<NumberFormat>() { @Override protected NumberFormat initialValue() { return NumberFormat.getCurrencyInstance(); } }; 

currencyFormat.get (). format (<your_amount_here>)

etProductCost.addTextChangedListener (nuevo TextWatcher () {@Override public void beforeTextChanged (CharSequence s, inicio int, int count, int after) {}

  @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.toString().length() == 1){ //first number inserted. if (s.toString().equals(getString(R.string.currency_symbol))){ //if it is a currecy symbol etProductCost.setText(""); }else { etProductCost.setText(getString(R.string.currency_symbol) + s.toString()); etProductCost.setSelection(s.toString().length()); } return; } //set cursor position to last in edittext etProductCost.setSelection(s.toString().length()); } @Override public void afterTextChanged(Editable s) {} }); 
  • Anotación personalizada de Java y carga dinámica
  • Android: URLConnection.getContentLength () que da un valor incorrecto
  • Evitar intentar / capturar en Android
  • Retrofit GSON serialize Fecha de la cadena json en long o java.lang.Long
  • Anular el primer día de la semana en joda?
  • Arreglo de objetos de calendario
  • Errores comunes durante la escritura de Android Project
  • Loop no es capturar duplicados y eliminarlos en Android (Java)
  • Carga pesada en el hilo que causa problemas de memoria
  • Búsqueda de Android con Fragmentos
  • Cómo cerrar la aplicación total en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.