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


Entrada de dinero de Android con decimal fijo

¿Cómo se crea una entrada edittext que formatos entrada en formato de dinero sólo? Cuando el usuario entra en 5, quiero que la entrada se vea como "$ 0.05" y cuando entran 3, la entrada ahora debe ser "$ 0.53" y finalmente ingresan 6 y la entrada debe ser "$ 5.36".

  • Cómo imprimir un doble con dos decimales en Android?
  • Android Studio - ¿Cómo personalizar el formato de salida de Logcat?
  • Formato AndroidManifest.xml de Eclipse
  • Insignia dinámica HTML de la aplicación de Google Play
  • Insertar comas en enteros
  • La pista EditText desaparece con la gravedad
  • Cómo dar formato a la latitud y longitud GPS?
  • Formato de tarjeta SD en Android
  • 7 Solutions collect form web for “Entrada de dinero de Android con decimal fijo”

    La solución completa de ninjasense funciona básicamente, pero tiene algunos problemas:

    1. Cada vez que los datos del campo se alteran en el manejador "onTextChanged", la posición del cursor se restablece al índice 0 en el campo, lo cual es un poco molesto cuando se escriben valores monetarios.
    2. Utiliza flotantes para formatear valores monetarios, lo que puede resultar contraproducente.

    Para el primer problema no tengo solución aún, para el segundo código como este funciona:

    @Override 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, '$'); cashAmountEdit.setText(cashAmountBuilder.toString()); } } 

    Construyendo Zds.

    Para mantener el cursor colocado al final del campo use esto.

     cashAmountEdit.setTextKeepState(cashAmountBuilder.toString()); Selection.setSelection(cashAmountEdit.getText(), cashAmountBuilder.toString().length()); 

    Puede usar un TextWatcher para hacer ese tipo de cosas.

    Amplíe TextWatcher: http://d.android.com/reference/android/text/TextWatcher.html

     public class MyTextWatcher implements TextWatcher { public void afterTextChanged(Editable arg0) { } public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { } } 

    A continuación, añádalo a tu editText con

     myEditText.addTextChangedListener(new MyTextWatcher()); 

    He encontrado el TextWatcher para ser un poco engorroso. En su lugar, puede establecer el oyente clave:

     setKeyListener(new CalculatorKeyListener()); // Must be called after setKeyListener(), otherwise is overridden setRawInputType(Configuration.KEYBOARD_12KEY); 

    Y luego crear un KeyListener que extiende NumberKeyListener:

     class CalculatorKeyListener extends NumberKeyListener { @Override public int getInputType() { return InputType.TYPE_CLASS_NUMBER; } @Override public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) { if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) { digitPressed(keyCode - KeyEvent.KEYCODE_0); } else if (keyCode == KeyEvent.KEYCODE_DEL) { deletePressed(); } return true; } @Override protected char[] getAcceptedChars() { return new char[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; } } 

    A continuación, debe mostrar los caracteres correctamente, pero eso no es difícil; Sólo mantenga un seguimiento de los centavos, y luego dividir o multiplicar por 10, y utilizar un NumberFormat para obtener el formato correcto.

    Heres mi solución completa:

      tvValue.setRawInputType(Configuration.KEYBOARD_12KEY); tvValue.addTextChangedListener(new TextWatcher(){ @Override public void afterTextChanged(Editable arg0) { // TODO Auto-generated method stub } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub // here i converted to string if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$")) { String userInput= ""+s.toString().replaceAll("[^\\d]", ""); Float in=Float.parseFloat(userInput); float percen = in/100; tvValue.setText("$"+percen); } } }); 

    Hice esto pero sin decimal y con punto por millas, comprobar el código y agregar la funcionalidad para apoyar decimales.

      MyEditText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count){ if(s.toString().length() > 0){ MyEditText.removeTextChangedListener(this); String numbers = removeCharacters(s.toString()); int money = 0; try{ money = Integer.parseInt(numbers); } catch(Exception ex){ money = 0; } MyEditText.setText(getMoney(money)); //Set cursor on correct position int selection = start; if(count > 0){ selection++; if(MyEditText.getText().toString().length() == 2 || MyEditText.getText().toString().length() == 6 || MyEditText.getText().toString().length() == 10){ selection++; } } else{ if(MyEditText.getText().toString().length() == 4 || MyEditText.getText().toString().length() == 8){ selection--; } } if(selection > MyEditText.getText().toString().length()){ selection = MyEditText.getText().toString().length(); } MyEditText.setSelection(selection); MyEditText.addTextChangedListener(this); } if(s.toString().length() == 1 && count < 1 && start == 1){ MyEditText.removeTextChangedListener(this); MyEditText.setText(""); MyEditText.addTextChangedListener(this); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after){ } @Override public void afterTextChanged(Editable s) { } }); public String removeCharacters(String money){ int i=0; while (i<money.length()) { Character c = money.charAt(i); if (Character.isDigit(c) && c != '.') { i++; } else { money = money.replace(c.toString(), ""); } } return money; } public String getMoney(int value){ String money = "$"; NumberFormat numberFormatter; numberFormatter = NumberFormat.getNumberInstance(Locale.GERMAN); money += numberFormatter.format(value); return money; } 

    Esta respuesta se basa en la respuesta de Zds (que a su vez se basó en la respuesta de ninjasense ), pero esto debería resolver el problema de la posición del cursor:

     if(!text.matches("^\\$(\\d{1,2})(\\.\\d{2})?$")) { int originalCursorPosition = view.getSelectionStart(); int cursorOffset = 0; boolean cursorAtEnd = originalCursorPosition == text.length(); String userInput= ""+text.replaceAll("[^\\d]", ""); StringBuilder cashAmountBuilder = new StringBuilder(userInput); while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') { cashAmountBuilder.deleteCharAt(0); cursorOffset--; } while (cashAmountBuilder.length() < 3) { cashAmountBuilder.insert(0, '0'); cursorOffset++; } cashAmountBuilder.insert(cashAmountBuilder.length() - 2, '.'); cashAmountBuilder.insert(0, '$'); view.setText(cashAmountBuilder.toString()); view.setSelection(cursorAtEnd ? view.getText().length() : originalCursorPosition + cursorOffset); } 

    Notas:

    • Lo siguiente está en un TextWatcher.onTextChanged
    • Estoy usando un regex diferente que otras respuestas, lo que mantiene el precio a <$ 100
    • 'View' es el editText, 'text' es el contenido de la cadena
    • Esto ha funcionado para mí con un EditText con un maxLength de 6 (es decir, $ 00.00)
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.