如何在用户输入时以mm/yy格式化信用卡到期日期

4 android

我想实现这样的算法:

一旦用户开始为"MM"输入数字,在用户输入两位"MM"后应该给出"/",然后,它应该只输入"yy"的最后两位数字.我怎样才能实现这种功能?

Goo*_*ife 14

android:maxLength="5"
Run Code Online (Sandbox Code Playgroud)

并设置为editText的电话,以便它可以显示"/"

android:inputType="phone"
Run Code Online (Sandbox Code Playgroud)

在textWatcher上执行此操作....我将稍后验证正确的mm/yy月份,以避免用户输入数据,如55/66 max应为12/31,但应该在少于或30天的时间内验证数月. .

 @Override
    public void afterTextChanged(Editable editable) {


        if (editable.length() > 0 && (editable.length() % 3) == 0) {
            final char c = editable.charAt(editable.length() - 1);
            if ('/' == c) {
                editable.delete(editable.length() - 1, editable.length());
            }
        }
        if (editable.length() > 0 && (editable.length() % 3) == 0) {
            char c = editable.charAt(editable.length() - 1);
            if (Character.isDigit(c) && TextUtils.split(editable.toString(), String.valueOf("/")).length <= 2) {
                editable.insert(editable.length() - 1, String.valueOf("/"));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


Xia*_*wei 5

我只是实现了一种方法,例如 Uber 信用卡日期格式,带有自动检查、自动完成、自动移动到 CVV 编辑文本。

 <EditText
            android:id="@+id/credit_card_expire_et"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginRight="@dimen/activity_horizontal_margin"
            android:layout_weight="1"
            android:hint="MM/YY"
            android:inputType="number"
            android:maxLength="5"
            android:maxLines="1" />

    <EditText
        android:id="@+id/credit_card_cvv_et"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/activity_horizontal_margin"
        android:layout_weight="1"
        android:hint="CVV"
        android:inputType="number"
        android:maxLength="3"
        android:maxLines="1" />
Run Code Online (Sandbox Code Playgroud)

.

@BindView(R.id.credit_card_expire_et)
EditText creditExpireEt;
@BindView(R.id.credit_card_cvv_et)
EditText creditCVVEt;


@OnTextChanged(value = R.id.credit_card_expire_et, callback = BEFORE_TEXT_CHANGED)
    void beforeExpireEtChanged() {
        previousLength = creditExpireEt.getText().toString().length();
    }

    @OnTextChanged(R.id.credit_card_expire_et)
    void autoFixAndMoveToNext() {
        int length = creditExpireEt.getText().toString().trim().length();

        if (previousLength <= length && length < 3) {
            int month = Integer.parseInt(creditExpireEt.getText().toString());
            if (length == 1 && month >= 2) {
                String autoFixStr = "0" + month + "/";
                creditExpireEt.setText(autoFixStr);
                creditExpireEt.setSelection(3);
            } else if (length == 2 && month <= 12) {
                String autoFixStr = creditExpireEt.getText().toString() + "/";
                creditExpireEt.setText(autoFixStr);
                creditExpireEt.setSelection(3);
            } else if (length ==2 && month > 12) {
                creditExpireEt.setText("1");
                creditExpireEt.setSelection(1);
            }
        } else if (length == 5) {
            creditCVVEt.requestFocus(); // auto move to next edittext
        }
    }
Run Code Online (Sandbox Code Playgroud)


job*_*ert 3

首先将 EditText 的最大字符数设置为 5,如下所示:

android:maxLength="5"
Run Code Online (Sandbox Code Playgroud)

并设置为数字editText

android:inputType="number"
Run Code Online (Sandbox Code Playgroud)

然后在EditText中添加一个onEditTextChangedListener来检测字符数是否从3个变为2个,如果没有,则将“/”删除:

edit_text.addTextChangedListener(object : TextWatcher {
    override fun afterTextChanged(p0: Editable?) {}

    override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {}

    override fun onTextChanged(p0: CharSequence?, start: Int, removed: Int, added: Int) {
        if (start == 1 && start+added == 2 && p0?.contains('/') == false) {
            edit_text.setText(p0.toString() + "/")
        } else if (start == 3 && start-removed == 2 && p0?.contains('/') == true) {
            edit_text.setText(p0.toString().replace("/", ""))
        }
    }
})
Run Code Online (Sandbox Code Playgroud)

  • 这会创建一个无限循环:更改 onTextChanged 事件内的文本会一遍又一遍地触发相同的事件...。 (4认同)