带有货币格式的EditText

tw-*_*w-S 13 android

我有一个EditText,我想在其中显示货币:

    input.setInputType(InputType.TYPE_CLASS_NUMBER);
    input.addTextChangedListener(new CurrencyTextWatcher());
Run Code Online (Sandbox Code Playgroud)

有:

public class CurrencyTextWatcher implements TextWatcher {

boolean mEditing;

public CurrencyTextWatcher() {
    mEditing = false;
}

public synchronized void afterTextChanged(Editable s) {
    if(!mEditing) {
        mEditing = true;

        String digits = s.toString().replaceAll("\\D", "");
        NumberFormat nf = NumberFormat.getCurrencyInstance();

        try{
            String formatted = nf.format(Double.parseDouble(digits)/100);
            s.replace(0, s.length(), formatted);
        } catch (NumberFormatException nfe) {
            s.clear();
        }

        mEditing = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想用户看一个只有数字的键盘,这就是我打电话的原因

input.setInputType(InputType.TYPE_CLASS_NUMBER);
Run Code Online (Sandbox Code Playgroud)

在我的EditText上.但是,它不起作用.我看到输入的数字没有任何格式.但是:如果我不通过input.setInputType(InputType.TYPE_CLASS_NUMBER)设置inputType,则格式化工作完美.但是用户必须使用常规键盘,这不是很好.如何使用数字键盘并在EditText中查看正确的货币格式?谢谢.

Mus*_*ssa 23

最好使用InputFilter接口.使用正则表达式更容易处理任何类型的输入.我的货币输入格式解决方案:

public class CurrencyFormatInputFilter implements InputFilter {

Pattern mPattern = Pattern.compile("(0|[1-9]+[0-9]*)?(\\.[0-9]{0,2})?");

@Override
public CharSequence filter(
        CharSequence source,
        int start,
        int end,
        Spanned dest,
        int dstart,
        int dend) {

    String result = 
            dest.subSequence(0, dstart)
            + source.toString() 
            + dest.subSequence(dend, dest.length());

    Matcher matcher = mPattern.matcher(result);

    if (!matcher.matches()) return dest.subSequence(dstart, dend);

    return null;
}
}
Run Code Online (Sandbox Code Playgroud)

有效期:
0.00,0.0,10.00,111.1无效:0,0.000,111,10,010.00,01.0

如何使用:

editText.setFilters(new InputFilter[] {new CurrencyFormatInputFilter()});
Run Code Online (Sandbox Code Playgroud)

  • 很好的方法,但给出的模式实际上不允许输入小数点,例如"12".因此您无法实际输入分数,输入后无法删除第一个数字,或只键入分数".12".解决这些问题的模式:"(0 | [1-9] + [0-9]*)?(\\.[0-9] {0,2})?" (9认同)

Luk*_*kap 6

尝试在您的 xml 声明中添加此属性以编辑文本:

android:inputType="numberDecimal" 或号码或签名号码

请参阅有关android:inputType 此处的更多信息。

  • 您可以添加 android:digits="0123456789" 禁止输入非数字字符 (4认同)