Check Credit Card Validity using Luhn Algorithm

前端 未结 12 1567
刺人心
刺人心 2020-12-03 04:02

I tried to check the validation of credit card using Luhn algorithm, which works as the following steps:

  1. Double every second digit from right to left. If do

相关标签:
12条回答
  • 2020-12-03 04:32

    Here's my implementation of the Luhn Formula.

    /**
     * Runs the Luhn Equation on a user inputed CCN, which in turn
     * determines if it is a valid card number.
     * @param c A user inputed CCN.
     * @param cn The check number for the card.
     * @return If the card is valid based on the Luhn Equation.
     */
    public boolean luhn (String c, char cn)
    {
        String card = c;
        String checkString = "" + cn;
        int check = Integer.valueOf(checkString);
    
        //Drop the last digit.
        card = card.substring(0, ( card.length() - 1 ) );
    
        //Reverse the digits.
        String cardrev = new StringBuilder(card).reverse().toString();
    
        //Store it in an int array.
        char[] cardArray = cardrev.toCharArray();
        int[] cardWorking = new int[cardArray.length];
        int addedNumbers = 0;
    
        for (int i = 0; i < cardArray.length; i++)
        {
            cardWorking[i] = Character.getNumericValue( cardArray[i] );
        }
    
        //Double odd positioned digits (which are really even in our case, since index starts at 0).
    
        for (int j = 0; j < cardWorking.length; j++)
        {
            if ( (j % 2) == 0)
            {
                cardWorking[j] = cardWorking[j] * 2;
            }
        }
    
        //Subtract 9 from digits larger than 9.
    
        for (int k = 0; k < cardWorking.length; k++)
        {
            if (cardWorking[k] > 9)
            {
                cardWorking[k] = cardWorking[k] - 9;
            }
        }
    
        //Add all the numbers together.
        for (int l = 0; l < cardWorking.length; l++)
        {
            addedNumbers += cardWorking[l];
        }
    
        //Finally, check if the number we got from adding all the other numbers
        //when divided by ten has a remainder equal to the check number.
        if (addedNumbers % 10 == check)
        {
            return true;
        }
        else
        {           
            return false;
        }
    }
    

    I pass in the card as c which I get from a Scanner and store in card, and for cn I pass in checkNumber = card.charAt( (card.length() - 1) );.

    0 讨论(0)
  • 2020-12-03 04:32
    public class LuhnAlgorithm {
    
    /**
     * Returns true if given card number is valid
     *
     * @param cardNum Card number
     * @return true if card number is valid else false
     */
    private static boolean checkLuhn(String cardNum) {
        int cardlength = cardNum.length();
        int evenSum = 0, oddSum = 0, sum;
        for (int i = cardlength - 1; i >= 0; i--) {
            System.out.println(cardNum.charAt(i));
            int digit = Character.getNumericValue(cardNum.charAt(i));
            if (i % 2 == 0) {
                int multiplyByTwo = digit * 2;
                if (multiplyByTwo > 9) {
                    /* Add two digits to handle cases that make two digits after doubling */
                    String mul = String.valueOf(multiplyByTwo);
                    multiplyByTwo = Character.getNumericValue(mul.charAt(0)) + Character.getNumericValue(mul.charAt(1));
                }
                evenSum += multiplyByTwo;
            } else {
                oddSum += digit;
            }
        }
        sum = evenSum + oddSum;
        if (sum % 10 == 0) {
            System.out.println("valid card");
            return true;
        } else {
            System.out.println("invalid card");
            return false;
        }
    
    }
    
    public static void main(String[] args) {
        String cardNum = "8112189875";
        System.out.println(checkLuhn(cardNum));
    }
    
    }
    

    Hope it may works.

    0 讨论(0)
  • 2020-12-03 04:33

    Okay, this can be solved with a type conversions to string and some Java 8 stuff. Don't forget numbers and the characters representing numbers are not the same. '1' != 1

    public static int[] longToIntArray(long cardNumber){
    
    return Long.toString(cardNumber).chars()
        .map(x -> x - '0') //converts char to int 
        .toArray();  //converts to int array
    }
    

    You can now use this method to perform the luhn algorithm:

      public static int luhnCardValidator(int cardNumbers[]) {
                    int sum = 0, nxtDigit;
                    for (int i = 0; i<cardNumbers.length; i++) {
                        if (i % 2 == 0) 
                          nxtDigit  = (nxtDigit > 4) ? (nxtDigit * 2 - 10) + 1 : nxtDigit * 2;
                        sum += nxtDigit;
                    }
                    return (sum % 10);
                }
    
    0 讨论(0)
  • 2020-12-03 04:33
    private static int luhnAlgorithm(String number){
        int n=0;
        for(int i = 0; i<number.length(); i++){
            int x = Integer.parseInt(""+number.charAt(i));
            n += (x*Math.pow(2, i%2))%10;
            if (x>=5 && i%2==1) n++;
        }
        return n%10;
    }
    
    0 讨论(0)
  • 2020-12-03 04:37
    public class Creditcard {
    
        public static void main(String args[]){
            Scanner sc=new Scanner(System.in);
            String cardno = sc.nextLine();
    
            if(checkType(cardno).equals("U")) //checking for unknown type
              System.out.println("UNKNOWN");
            else
              checkValid(cardno); //validation 
    }
    
    private static String checkType(String S)
    {
        int AM=Integer.parseInt(S.substring(0,2));
        int D=Integer.parseInt(S.substring(0,4)),d=0;
        for(int i=S.length()-1;i>=0;i--)
        {
            if(S.charAt(i)==' ')
                continue;
            else
                d++;
        }
        if((AM==34 || AM==37) && d==15)
            System.out.println("AMEX");
        else if(D==6011 && d==16)
            System.out.println("Discover");
        else if(AM>=51 && AM<=55 && d==16)
            System.out.println("MasterCard");
        else if(((S.charAt(0)-'0')==4)&&(d==13 || d==16)) 
            System.out.println("Visa");
        else
            return "U";
        return "";
    }
    
    private static void checkValid(String S) // S--> cardno
    {
        int i,d=0,sum=0,card[]=new int[S.length()];
    
        for(i=S.length()-1;i>=0;i--)
        {
            if(S.charAt(i)==' ')
                continue;
            else
                card[d++]=S.charAt(i)-'0';
        }
    
        for(i=0;i<d;i++)
        {
            if(i%2!=0)
            {
                card[i]=card[i]*2;
                if(card[i]>9)
                    sum+=digSum(card[i]);
                else
                    sum+=card[i];
            }
            else
                sum+=card[i];
        }
        if(sum%10==0)
            System.out.println("Valid");
        else    
            System.out.println("Invalid");
    
    }
    
    public static int digSum(int n)
    {
        int sum=0;
        while(n>0)
        {
            sum+=n%10;
            n/=10;
        }
        return sum;
    }
    }
    
    0 讨论(0)
  • 2020-12-03 04:38

    There are two ways to split up your int into List<Integer>

    1. Use %10 as you are using and store it into a List
    2. Convert to a String and then take the numeric values

    Here are a couple of quick examples

    public static void main(String[] args) throws Exception {
        final int num = 12345;
        final List<Integer> nums1 = splitInt(num);
        final List<Integer> nums2 = splitString(num);
        System.out.println(nums1);
        System.out.println(nums2);
    }
    
    private static List<Integer> splitInt(int num) {
        final List<Integer> ints = new ArrayList<>();
        while (num > 0) {
            ints.add(0, num % 10);
            num /= 10;
        }
        return ints;
    }
    
    private static List<Integer> splitString(int num) {
        final List<Integer> ints = new ArrayList<>();
        for (final char c : Integer.toString(num).toCharArray()) {
            ints.add(Character.getNumericValue(c));
        }
        return ints;
    }
    
    0 讨论(0)
提交回复
热议问题