在以字母字符串为前缀的数字前填充零

Padding zeros in front of number prefixed by alphabetic string

我有一个字符串,即 AB1234。我正在尝试创建一个方法,我可以将字符串传递给该方法,该方法将始终在整数前面填充零以创建一个 10 位数字的字符串。

一些示例:

padZero("AB1234") returns "AB00001234"

padZero("CD001234") returns "CD00001234"

padZero("ABCDEF858") returns "ABCDEF0858"

有没有一种简单的方法可以做到这一点,而无需尝试捕捉大量极端情况?假设在方法调用之前捕获了大于十位数字的字符串被传递到该方法的情况。

public static void main(String[] args) {
    System.out.println(padZero("abc123"));
}

public static String padZero(String init) {
    Matcher matcher = Pattern.compile("\d+").matcher(init);
    matcher.find();
    return String.format("%s%0" + (10-matcher.start()) + "d", init.substring(0, matcher.start()), Integer.valueOf(matcher.group()));
}

我认为最简单的方法是找到第一个数字,然后插入足够多的零来填充到 10 个数字:

if (text.matches("\d")) {
    while (text.length() < 10) {
        text = text.replaceFirst("(\d)", "0");
    }
}

以防万一您不想做出假设而是在无效输入字符串上快速失败:

private static final Pattern STRING_FORMAT = Pattern.compile("(\D+)(\d+)");

public static final String padZeros(String s) {
    Matcher matcher = STRING_FORMAT.matcher(s);
    if (!matcher.matches() || s.length() > 10)
        throw new IllegalArgumentException("Invalid format");
    char[] result = new char[10];
    Arrays.fill(result, '0');
    String nonDigits = matcher.group(1);
    String digits = matcher.group(2);
    nonDigits.getChars(0, nonDigits.length(), result, 0);
    digits.getChars(0, digits.length(), result, 10 - digits.length());
    return String.valueOf(result);
}