EditText始终显示带有2位小数的数字

我想显示在任何时候都有两位小数的EditText字段的input。 因此,当用户input5时,将显示5.00或当用户input7.5时,将显示7.50。

除此之外,我还希望当字段是空的,而不是什么都显示为零。

我已经有了inputtypes设置为:

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

我仍然在为我的问题的另一半解决scheme。 如果我find解决scheme,我也会在这里发布。

编辑2011-07-09 23.35 – 已解决的第2部分(共2部分):将用户input更改为具有两位小数的数字。

 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位小数的数字"

这是我用来进行美元input的东西。 它确保在任何时候都只有小数点后两位。 您应该能够通过删除$符号来适应您的需求。

  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方法进行更改… EditText内容为此任务。

我在我的多语言应用程序中有相同的任务,我知道这是可能的,或者. 符号作为分隔符,所以我修改为0.00格式的nickfox答案,符号的总数限制为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) { } }); } 

这对我来说看起来是最好的结果。 现在这段代码支持复制粘贴操作

只是对帕特里克发布的解决scheme做了一些小的改动。 我已经实现了onFocusChangedListener中的所有内容。 还要确保将EditTextinputtypes设置为“number | numberDecimal”。

更改如下:如果input为空,则用“0.00”replace。 如果input有两个以上的精度小数,则将其舍弃为两位小数。 一些小的重构。

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