我有一个EditText,用户想要输入价格。为了保持一致性,我决定自动包含小数值。
例如"1" entered by user would become "1.00"
。
现在,在使用效率低下的代码之后,我可以在StackOverFlow中找到更好的代码
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());
}
}
});
使用上面的代码,一旦用户开始输入数字,就会开始包含十进制值。但是,用户添加的数值将显示为$ symbol
。因此,我对第07行中的代码进行了一些修改,删除了第19行。
新代码
returnPrice.setRawInputType(Configuration.KEYBOARD_12KEY);
returnPrice.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, '.');
returnPrice.setText(cashAmountBuilder.toString());
// keeps the cursor always to the right
Selection.setSelection(returnPrice.getText(), cashAmountBuilder.toString().length());
}
}
});
我的问题
因此,我在02中遇到的问题是,当我在EditText中输入数值时 - 除非输入小数点,否则EditText中的数值将显示为整数。
例如:案例01
为了在打字时显示100.00,值开始显示为0.01美元,然后是0.10美元,然后是1.00美元,10.00美元,最后是100.00美元。在任何情况下,在这种情况下我都不需要手动输入小数点。
例如:案例02
为了在我打字时显示100.00,值开始显示为1,然后是10,然后是100.现在,如果我按下软键盘上的小数点,则100变为1.00,输入值变为10.00,最后100.00。如果键盘上未触及小数点,则输入10000时的结果值为10000而不是100.00。
我犯的错误是什么?有什么建议吗?