Sha256: 24882b83e5d54c3e2a18fafc2e308d2e1016c026a8d16dee7892788a7a14c5d0
Contents?: true
Size: 1.57 KB
Versions: 300
Compression:
Stored size: 1.57 KB
Contents
import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; final class LuhnValidator { private static final Pattern SPACE_PATTERN = Pattern.compile("\\s+"); boolean isValid(final String candidate) { final String sanitizedCandidate = SPACE_PATTERN.matcher(candidate).replaceAll(""); if (sanitizedCandidate.length() <= 1) { return false; } // We need to alter every second digit counting from the right. Reversing makes this easy! final String reversedSanitizedCandidate = reverse(sanitizedCandidate); final List<Integer> computedDigits = new ArrayList<>(); for (int charIndex = 0; charIndex < reversedSanitizedCandidate.length(); charIndex++) { int inputDigit = Character.digit(reversedSanitizedCandidate.charAt(charIndex), 10); /* * Character.digit returns a negative int if the supplied character does not represent a digit with respect * to the given radix. */ if (inputDigit < 0) { return false; } if (charIndex % 2 == 1) { inputDigit = 2 * inputDigit; if (inputDigit > 9) { inputDigit -= 9; } } computedDigits.add(inputDigit); } final int digitSum = computedDigits.stream().mapToInt(Integer::intValue).sum(); return digitSum % 10 == 0; } private String reverse(final String string) { return new StringBuilder(string).reverse().toString(); } }
Version data entries
300 entries across 300 versions & 1 rubygems