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.
- Ocultar icono del lanzador de aplicaciones en la barra de título cuando se inicia la actividad en android
- ¿El postDelayed hace que el mensaje salte al frente de la cola?
- El método getWindow () no está definido para el tipo AlertDialog.Builder
- Android: Cuando configuro OnClickListener para un ListView
- adb no puede encontrar mi dispositivo para la depuración de Android. ¿Por qué?
- Android: api 16 dibuja el contorno del rectángulo como rectángulo relleno
- Añadiendo a Fragmento ArrayAdapter de Activity AlertDialog
- Cómo cambiar el tema de la aplicación de "Actividad en blanco" a "Flujo maestro / detallado"
- Convierta el Array de Java normal o ArrayList a Json Array en android
- El botón de retroceso de Android no vuelve a la actividad anterior
- Cómo codificar un símbolo de Euro en strings.xml en los archivos de android XML
- Java La importación com.google no se puede resolver
- El nombre del paquete de refactorización rompe toda la aplicación
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) {} });
- Java cómo incrementar un int 1 cada segundo hasta que llegue a 15
- cómo establecer la flecha desplegable en el hilandero con el fondo?