我想通过将用空格分隔的数字分组来格式化信用卡号
例如5112345112345114格式应为:5112 3451 1234 5114.
我想指定一个遮罩并将数字渲染到其中。例如:“#### #### #### ####”表示16位信用卡号码。对于Amex(15位)它应该如下所示:“#### ###### #####”。如果号码尚未完全可用(由持卡人输入),则应从左侧开始进入掩码。
Java中是否有库或甚至是API来执行此操作?我查看了java.text.MessageFormat,但找不到拆分字符串的方法。似乎.net有一个API:String.Format(“{0:0000 0000 0000 0000}”,数字)。
答案 0 :(得分:5)
您可以检查卡号的长度并应用适当的正则表达式。例如:
cardNumber.replaceAll("\\d{4}", "$0 ");
cardNumber.replaceFirst("\\d{4}", "$0 ").replaceFirst("\\d{6}", "$0 ");
答案 1 :(得分:0)
将字符串分组为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
答案 2 :(得分: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)
}
}