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

Version Path
trackler-2.2.1.180 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.179 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.178 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.177 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.176 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.175 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.174 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.173 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.172 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.171 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.170 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.169 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.167 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.166 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.165 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.164 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.163 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.162 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.161 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java
trackler-2.2.1.160 tracks/java/exercises/luhn/.meta/src/reference/java/LuhnValidator.java