in src/main/java/org/apache/commons/validator/routines/CreditCardValidator.java [290:330]
static CodeValidator createRangeValidator(final CreditCardRange[] creditCardRanges, final CheckDigit digitCheck) {
return new CodeValidator(
// must be numeric (rest of validation is done later)
new RegexValidator("(\\d+)") {
private static final long serialVersionUID = 1L;
private final transient CreditCardRange[] ccr = creditCardRanges.clone();
@Override
public boolean isValid(final String value) {
return validate(value) != null;
}
@Override
public String[] match(final String value) {
return new String[] { validate(value) };
}
@Override
// must return full string
public String validate(final String value) {
if (super.match(value) != null) {
final int length = value.length();
for (final CreditCardRange range : ccr) {
if (validLength(length, range)) {
if (range.high == null) { // single prefix only
if (value.startsWith(range.low)) {
return value;
}
} else if (range.low.compareTo(value) <= 0 // no need to trim value here
&&
// here we have to ignore digits beyond the prefix
range.high.compareTo(value.substring(0, range.high.length())) >= 0) {
return value;
}
}
}
}
return null;
}
}, digitCheck);
}