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

Posted

技术标签:

【中文标题】Android EditText - 只允许一个小数分隔符【英文标题】:Android EditText - allow only one decimal separator 【发布时间】:2014-02-15 08:05:54 【问题描述】:

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

输入过滤器代码:

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;
  

我的 EditText 的 xml:

<EditText
    android:id="@+id/my_edit_text"
    android:layout_
    android:layout_
    android:freezesText="true"
    android:imeOptions="actionDone"
    android:digits="0123456789.,"
    android:inputType="numberDecimal"
    android:selectAllOnFocus="true"
    android:singleLine="true"
    android:textSize="16sp" />

【问题讨论】:

【参考方案1】:

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

方法一:

editText.setKeyListener(DigitsKeyListener.getInstance(true,true));

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

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

DecimalFormat format = (DecimalFormat) DecimalFormat.getInstance(Locale.getDefault());
DecimalFormatSymbols symbols=format.getDecimalFormatSymbols();
defaultSeperator=Character.toString(symbols.getDecimalSeparator());

然后在你的 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));
    

【讨论】:

以上是关于Android EditText - 只允许一个小数分隔符的主要内容,如果未能解决你的问题,请参考以下文章

android EditText maxLength 允许用户输入更多

如何实现android EditText允许输入字母和数字,同时默认弹出数字键盘?

Edittext 只允许字母(以编程方式)

小部件中的 EditText 替代品?必须有办法

Android Word-Wrap EditText 文本

有没有办法限制 Android 软键盘只允许表情符号字符?