public class MaskDigitsKeepFormat {
public static String maskDigits(String input, int visibleDigits) {
if (input == null) return null;
// Count total digits
long totalDigits = input.chars().filter(Character::isDigit).count();
long digitsToMask = Math.max(0, totalDigits - visibleDigits);
StringBuilder result = new StringBuilder();
long maskedCount = 0;
for (char c : input.toCharArray()) {
if (Character.isDigit(c)) {
if (maskedCount < digitsToMask) {
result.append('*');
maskedCount++;
} else {
result.append(c);
}
} else {
result.append(c); // Preserve formatting characters like '-', ' ', etc.
}
}
return result.toString();
}
public static void main(String[] args) {
System.out.println(maskDigits("1234-5678-9012-3456", 4)); // ****-****-****-3456
System.out.println(maskDigits("+1 (800) 555-0199", 4)); // +* (***) ***-0199
}
}
/*
run
****-****-****-3456
+* (***) ***-0199
*/