3

我想通过对以空格分隔的数字进行分组来格式化信用卡号

例如 5112345112345114 应格式化为:5112 3451 1234 5114。

我想指定一个掩码并将数字呈现到其中。例如:“#### #### #### ####”表示 16 位信用卡号。对于美国运通(15 位),它应该如下所示:“#### ###### #####”。如果该号码尚未完全可用(由持卡人输入),则应从左侧开始渲染到掩码中。

Java中是否有库甚至API可以做到这一点?我查看了 java.text.MessageFormat 但找不到拆分字符串的方法。.net 似乎有一个 API:String.Format("{0:0000 0000 0000 0000}", number)。

4

3 回答 3

5

您可以检查卡号的长度并应用适当的正则表达式。例如:

    cardNumber.replaceAll("\\d{4}", "$0 ");
    cardNumber.replaceFirst("\\d{4}", "$0 ").replaceFirst("\\d{6}", "$0 ");
于 2013-10-19T14:32:43.980 回答
3

按 4 个符号对字符串进行分组

public static String formatCard(String cardNumber) {
    if (cardNumber == null) return null;
    char delimiter = ' ';
    return cardNumber.replaceAll(".{4}(?!$)", "$0" + delimiter);
}

regexp 表示:如果不是行尾,则每 4 个符号

?!是一个否定的前瞻断言 - 如果在 4 个符号之后没有行尾,则为真。

测试:

in:  1234567890123456
out: 1234 5678 9012 3456
in:  12345678901234
out: 1234 5678 9012 34
于 2018-01-13T14:56:55.053 回答
0

这是一个解决方案,您可以如何在TextWatcher. 您可以自行更改空间索引。

class CreditCardFormatWatcher : TextWatcherAdapter() {

    override fun afterTextChanged(s: Editable?) {
        if (s == null || s.isEmpty()) return

        s.forEachIndexed { index, c ->
            val spaceIndex = index == 4 || index == 9 || index == 14
            when {
                !spaceIndex && !c.isDigit()     -> s.delete(index, index + 1)
                spaceIndex && !c.isWhitespace() -> s.insert(index, " ")
            }
        }

        if (s.last().isWhitespace())
            s.delete(s.length - 1, s.length)
    }

}
于 2018-06-12T16:03:13.800 回答