Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中格式化信用卡号_Java_String Formatting - Fatal编程技术网

如何在Java中格式化信用卡号

如何在Java中格式化信用卡号,java,string-formatting,Java,String Formatting,我想通过分组以空格分隔的数字来格式化信用卡号 例如,5112345112345114的格式应为:5112 3451 1234 5114 我想指定一个掩码并将数字渲染到其中。例如,对于16位数的信用卡号,使用“###############”表示。对于美国运通(15位),它应该是这样的:“##########”。如果号码尚未完全可用(由持卡人输入),则应从左侧开始将其渲染到掩码中 Java中是否有一个库或API来实现这一点?我查看了java.text.MessageFormat,但找不到拆分字符串

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

例如,5112345112345114的格式应为:5112 3451 1234 5114

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


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)
    }

}