如何在Java中格式化信用卡号
我想通过分组以空格分隔的数字来格式化信用卡号 例如,5112345112345114的格式应为:5112 3451 1234 5114 我想指定一个掩码并将数字渲染到其中。例如,对于16位数的信用卡号,使用“###############”表示。对于美国运通(15位),它应该是这样的:“##########”。如果号码尚未完全可用(由持卡人输入),则应从左侧开始将其渲染到掩码中如何在Java中格式化信用卡号,java,string-formatting,Java,String Formatting,我想通过分组以空格分隔的数字来格式化信用卡号 例如,5112345112345114的格式应为:5112 3451 1234 5114 我想指定一个掩码并将数字渲染到其中。例如,对于16位数的信用卡号,使用“###############”表示。对于美国运通(15位),它应该是这样的:“##########”。如果号码尚未完全可用(由持卡人输入),则应从左侧开始将其渲染到掩码中 Java中是否有一个库或API来实现这一点?我查看了java.text.MessageFormat,但找不到拆分字符串
Java中是否有一个库或API来实现这一点?我查看了java.text.MessageFormat,但找不到拆分字符串的方法。net似乎有一个API:String.Format(“{0:0000}”,number) 您可以检查卡号的长度并应用适当的regexp。例如:
cardNumber.replaceAll("\\d{4}", "$0 ");
cardNumber.replaceFirst("\\d{4}", "$0 ").replaceFirst("\\d{6}", "$0 ");
按4个符号对字符串进行分组
public static String formatCard(String cardNumber) {
if (cardNumber == null) return null;
char delimiter = ' ';
return cardNumber.replaceAll(".{4}(?!$)", "$0" + delimiter);
}
regexp的意思是:如果不是行尾,则每4个符号
是一个否定的前瞻断言-如果在4个符号之后没有行的结尾,则为真
测试:
以下是如何在
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)
}
}
添加前视以避免尾随空格:
“5112345112345114”.replaceAll(/\d{4}(?=\d)/,“$0')==”51123414“
将任何字符串内容分组为4组的更通用解决方案:“511234511414”.replaceAll(/.{4}(?!$)/,“$0')=”51123414“
关于格式语法的更多信息可能会更好。
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)
}
}