Android : 将十进制输入过滤器与 NumberFormat 一起使用时不显示第一位数字
Android : First digit is not displaying when using decimal input filter with NumberFormat
在我的 android 应用程序中,我使用 decimal
输入过滤器来阻止小数点前 seperator(.)
到 14 和点后到 4 的位数,还使用 NumberFormat
使用美国语言环境来格式化 user.I 输入的金额,当我如下尝试此操作时注意到 2 个问题。
- 14位整数不能输入小数位digits.Can不足14位
Integer
位输入decimal
当更改大于 999 的金额时,用户输入的第一个数字没有注册,我注意到任何大于 999 的数字都会用逗号格式化,所以当用新金额更改这些金额时输入的第一个数字不会出现,为什么 so.Suppose Edittext
包含金额 4,000.00 然后更改为 9500 然后只有 500 是 displayed.but 当我们更改金额如 450.00 时没有逗号然后没有问题,所有数字都将 come.Below 是我的代码。
NumberFormat formatUsTwo = NumberFormat.getInstance(Locale.US);
edtAmount=(EditText) v.findViewById(R.id.edtAmount);
edtAmount.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(14,4)});
edtAmount.setText(formatUsTwo.format(9000));
edtAmount.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean hasFocus) {
if(!hasFocus){
Double change=Double.parseDouble(edtAmount.getText().toString().trim().replace(",", ""));
edtAmount.setText(formatUsTwo.format(change));
}else{
onFocus(view, holder);
}
}
});
public class DecimalDigitsInputFilter implements InputFilter {
Pattern mPattern;
public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) {
mPattern = Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}+((\.[0-9]{0," + (digitsAfterZero - 1) + "})?)||(\.)?");
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
Matcher matcher = mPattern.matcher(dest);
if (!matcher.matches())
return "";
return null;
}
}
我花了一半 day.I 更改了下面的 DecimalInputDegitsFilter class 屁股,终于解决了这个问题。
public class DecimalDigitsInputFilter implements InputFilter {
Pattern mPattern;
int digitsBeforeZero,digitsAfterZero;
public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) {
this.digitsBeforeZero = digitsBeforeZero;
this.digitsAfterZero = digitsAfterZero;
mPattern = Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}+((\.[0-9]{0," + (digitsAfterZero - 1) + "})?)||(\.)?");
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
Matcher matcher = mPattern.matcher(dest.toString().replace(",", ""));
if (!matcher.matches()) {
if (dest.toString().contains(".")) {
if (dest.toString().substring(dest.toString().indexOf(".")).length() > digitsAfterZero) {
return "";
}
return null;
} else if (!Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}").matcher(dest).matches()) {
if (!dest.toString().contains(".")) {
if (source.toString().equalsIgnoreCase(".")) {
return null;
}
}
return "";
}
return "";
}
return null;
}
}
在我的 android 应用程序中,我使用 decimal
输入过滤器来阻止小数点前 seperator(.)
到 14 和点后到 4 的位数,还使用 NumberFormat
使用美国语言环境来格式化 user.I 输入的金额,当我如下尝试此操作时注意到 2 个问题。
- 14位整数不能输入小数位digits.Can不足14位
Integer
位输入decimal
当更改大于 999 的金额时,用户输入的第一个数字没有注册,我注意到任何大于 999 的数字都会用逗号格式化,所以当用新金额更改这些金额时输入的第一个数字不会出现,为什么 so.Suppose
Edittext
包含金额 4,000.00 然后更改为 9500 然后只有 500 是 displayed.but 当我们更改金额如 450.00 时没有逗号然后没有问题,所有数字都将 come.Below 是我的代码。NumberFormat formatUsTwo = NumberFormat.getInstance(Locale.US);
edtAmount=(EditText) v.findViewById(R.id.edtAmount); edtAmount.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(14,4)}); edtAmount.setText(formatUsTwo.format(9000)); edtAmount.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View view, boolean hasFocus) { if(!hasFocus){ Double change=Double.parseDouble(edtAmount.getText().toString().trim().replace(",", "")); edtAmount.setText(formatUsTwo.format(change)); }else{ onFocus(view, holder); } } }); public class DecimalDigitsInputFilter implements InputFilter { Pattern mPattern; public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) { mPattern = Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}+((\.[0-9]{0," + (digitsAfterZero - 1) + "})?)||(\.)?"); } @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { Matcher matcher = mPattern.matcher(dest); if (!matcher.matches()) return ""; return null; } }
我花了一半 day.I 更改了下面的 DecimalInputDegitsFilter class 屁股,终于解决了这个问题。
public class DecimalDigitsInputFilter implements InputFilter {
Pattern mPattern;
int digitsBeforeZero,digitsAfterZero;
public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero) {
this.digitsBeforeZero = digitsBeforeZero;
this.digitsAfterZero = digitsAfterZero;
mPattern = Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}+((\.[0-9]{0," + (digitsAfterZero - 1) + "})?)||(\.)?");
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
Matcher matcher = mPattern.matcher(dest.toString().replace(",", ""));
if (!matcher.matches()) {
if (dest.toString().contains(".")) {
if (dest.toString().substring(dest.toString().indexOf(".")).length() > digitsAfterZero) {
return "";
}
return null;
} else if (!Pattern.compile("[0-9]{0," + (digitsBeforeZero - 1) + "}").matcher(dest).matches()) {
if (!dest.toString().contains(".")) {
if (source.toString().equalsIgnoreCase(".")) {
return null;
}
}
return "";
}
return "";
}
return null;
}
}