Android EditText - 只允许一个小数分隔符

Seb*_*lis 5 android number-formatting android-edittext

我希望EditText只允许0123456789.,将逗号和点都改为指定的字符的字符mCurrencyFormatter.getDecimalSeparator().第二部分通过以下filter(...)方法实现InputFilter.但是,我无法强制EditText阻止第二个逗号/点.我想通过这个类中的注释代码来做到这一点,但是它没有用.我知道可以写一个android:inputType="numberDecimal"xml文件,但由于长期存在的android bug,它总是将小数点分隔符识别为点.有谁知道如何防止输入第二个小数分隔符?

InputFilter代码:

class CurrencyInputFilter implements InputFilter {
  StringBuilder sb = new StringBuilder();
  boolean decimalExists;

  @Override
  public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
      int dend) {
    sb.setLength(0);
    decimalExists = false;
    char c;
    // for (int i = 0; i < start - 1; i++) {
    // c = source.charAt(i);
    // if (Character.toString(c).equals(".") || Character.toString(c).equals(",")) {
    // decimalExists = true;
    // break;
    // }
    // }
    // if (!decimalExists) for (int i = end; i < source.length(); i++) {
    // c = source.charAt(i);
    // if (Character.toString(c).equals(".") || Character.toString(c).equals(",")) {
    // decimalExists = true;
    // break;
    // }
    // }

    for (int i = start; i < end; i++) {
      c = source.charAt(i);
      if (Character.isDigit(c)) sb.append(c);
      if ((Character.toString(c).equals(".") || Character.toString(c).equals(","))
          && !decimalExists) {
        sb.append(mCurrencyFormatter.getDecimalSeparator());
        // decimalExists = true;
      }
    }
    // decimalExists = false;
    return sb;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的EditText的xml:

<EditText
    android:id="@+id/my_edit_text"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:freezesText="true"
    android:imeOptions="actionDone"
    android:digits="0123456789.,"
    android:inputType="numberDecimal"
    android:selectAllOnFocus="true"
    android:singleLine="true"
    android:textSize="16sp" />
Run Code Online (Sandbox Code Playgroud)

Kom*_*lot 6

希望这会对某人有所帮助.我需要以编程方式执行此操作.

方法1:

editText.setKeyListener(DigitsKeyListener.getInstance(true,true));
Run Code Online (Sandbox Code Playgroud)

方法2 :(方法1对我不起作用)

首先根据设备区域设置获取默认的小数点分隔符:

DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(Locale.getDefault());
DecimalFormatSymbols symbols=format.getDecimalFormatSymbols();
defaultSeperator=Character.toString(symbols.getDecimalSeparator());
Run Code Online (Sandbox Code Playgroud)

然后在EditText TextWatcher的afterTextChanged中添加:

editText.addTextChangedListener(new TextWatcher() {
        public void afterTextChanged(Editable editable) {
if(editable.toString().contains(defaultSeperator))
    editText.setKeyListener(DigitsKeyListener.getInstance("0123456789"));
else
    editText.setKeyListener(DigitsKeyListener.getInstance("0123456789" + defaultSeperator));
    }
}
Run Code Online (Sandbox Code Playgroud)