EditText, показывающий числа с двумя десятичными знаками в любое время

Я хотел бы постоянно отображать ввод полей EditText с двумя десятичными знаками. Поэтому, когда пользователь вводит 5, он покажет 5.00 или когда пользователь войдет в 7.5, он покажет 7.50.

Кроме того, я хотел бы также показать нуль, когда поле пусто, а не ничего.

У меня уже есть параметр ввода:

android:inputType="number|numberDecimal"/> 

Должен ли я работать с inputfilters здесь?

Извините, я до сих пор совершенно новый для android / java …

Спасибо за вашу помощь!

Редактировать 2011-07-09 23.35 – Решенная часть 1 из 2: «» до 0,00.

С ответом nickfox я смог решить половину своего вопроса.

  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); } } }); 

Я все еще работаю над решением для другой половины моего вопроса. Если я найду решение, я отправлю его здесь тоже.

Редактировать 2011-07-09 23.35 – Решенная часть 2 из 2: изменение ввода пользователя на число с двумя десятичными знаками.

 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"); } } } } 

Solutions Collecting From Web of "EditText, показывающий числа с двумя десятичными знаками в любое время"

Вот что я использую для ввода в долларах. Он гарантирует, что во всех случаях есть только 2 места за десятичной точкой. Вы должны уметь адаптировать его к своим потребностям, удалив знак $.

  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()); } } }); 

Обновление # 2

Исправьте меня, если я ошибаюсь, но официальные документы TextWatcher говорят, что это законное использование метода afterTextChanged для внесения изменений в … Редактирование содержимого для этой задачи.

У меня такая же задача в моем многоязычном приложении, и, насколько я знаю, это возможно , или . Символы как разделитель, поэтому я изменяю ответ nickfox для формата 0,00 с общим лимитом символов до 10:

Макет (обновлено):

 <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:

 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); } } 

Код в методе ocCreate (Обновление # 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) { } }); } 

Для меня это лучший результат. Теперь этот код поддерживает операции копирования-вставки

Просто некоторые незначительные изменения в решениях, опубликованных patrick. Я реализовал все в onFocusChangedListener. Также не забудьте установить тип ввода EditText на «number | numberDecimal».

Изменения: если вход пуст, замените его на «0.00». Если вход имеет более двух десятичных значений точности, то сбрасывается до двух десятичных знаков. Небольшой рефакторинг.

 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); } } });