Ошибка проверки кредитной карты LUHN на действительном номере карты

В моем приложении я хочу проверить, ввел ли пользователь действительный номер карты, для чего я использовал алгоритм LUHN. Я создал его как метод и вызвал в mainacctivity. Но даже если я даю действительный номер карты, он показывает, что он недействителен. При вводе номера карты я дал пробелы между ними, о которых я не знал, потому что он не проверяется должным образом. Пожалуйста, помогите мне найти ошибку.

CreditcardValidation.java

public class CreditcardValidation {
    String creditcard_validation,msg;
    //String mobilepattern;
     public static boolean isValid(long number) {

            int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number);
            if ((total % 10 == 0) && (prefixMatched(number, 1) == true) && (getSize(number)>=16 ) && (getSize(number)<=19 )) {
                return true;
            } else {
                return false;
            }
        }

        public static int getDigit(int number) {

            if (number <= 9) {
                return number;
            } else {
                int firstDigit = number % 10;
                int secondDigit = (int) (number / 10);

                return firstDigit + secondDigit;
            }
        }
        public static int sumOfOddPlace(long number) {
            int result = 0;

            while (number > 0) {
                result += (int) (number % 10);
                number = number / 100;
            }

            return result;
        }

        public static int sumOfDoubleEvenPlace(long number) {

            int result = 0;
            long temp = 0;

            while (number > 0) {
                temp = number % 100;
                result += getDigit((int) (temp / 10) * 2);
                number = number / 100;
            }

            return result;
        }

        public static boolean prefixMatched(long number, int d) {

            if ((getPrefix(number, d) == 5)
                    || (getPrefix(number, d) == 4)
                    || (getPrefix(number, d) == 3)) {

                if (getPrefix(number, d) == 4) {
                    System.out.println("\nVisa Card ");
                } else if (getPrefix(number, d) == 5) {
                    System.out.println("\nMaster Card ");
                } else if (getPrefix(number, d) == 3) {
                    System.out.println("\nAmerican Express Card ");
                }

                return true;

            } else {

                return false;

            }
        }

        public static int getSize(long d) {

            int count = 0;

            while (d > 0) {
                d = d / 10;

                count++;
            }

            return count;

        }

        public static long getPrefix(long number, int k) {

            if (getSize(number) < k) {
                return number;
            } else {

                int size = (int) getSize(number);

                for (int i = 0; i < (size - k); i++) {
                    number = number / 10;
                }

                return number;

            }

        }


        public String creditcardvalidation(String creditcard)
        {       
             Scanner sc = new Scanner(System.in);

              this.creditcard_validation= creditcard;
              long input = 0;
             input = sc.nextLong();
            //long input = sc.nextLong();
               if (isValid(input) == true) {
                   Log.d("Please fill all the column","valid");
                msg="Valid card number";

               }
               else{
                   Log.d("Please fill all the column","invalid");
                msg="Please enter the valid card number";

               }

               return msg;
} 
} 


MainActivity.java

addcard.setOnClickListener(new OnClickListener() 
{   
    @Override
    public void onClick(View v) {


            if(v.getId()==R.id.btn_add)
            {
                creditcard= card_number.getText().toString();
                cv = new  CreditcardValidation();
                String mob = cv.creditcardvalidation(creditcard);
                 Toast.makeText(getActivity(), mob, 1000).show();``

2 ответа

Решение

См. код ниже

 EditText cardNumber=(EditText)findViewById(R.id.cardNumber);
        String CreditCardType = "Unknown";

       /// Remove all spaces and dashes from the passed string
        String CardNo ="9292304336";///////cardNumber.getText().toString();           
        CardNo = CardNo.replace(" ", "");//removing empty space
             CardNo = CardNo.replace("-", "");//removing '-'
              twoDigit=Integer.parseInt(CardNo.substring(0, 2));
                                 System.out.println("----------twoDigit--"+twoDigit);
              fourDigit=Integer.parseInt(CardNo.substring(0, 4));
                                 System.out.println("----------fourDigit--"+fourDigit);
             oneDigit=Integer.parseInt(Character.toString(CardNo.charAt(0)));
                                System.out.println("----------oneDigit--"+oneDigit);

             boolean cardValidation=false;
            // 'Check that the minimum length of the string isn't <14 characters and -is- numeric
             if(CardNo.length()>=14)
             {

                 cardValidation=cardValidationMethod(CardNo);

             }

 boolean cardValidationMethod(String CardNo)
     {
        //'Check the first two digits first,for AmericanExpress
        if(CardNo.length()==15 && (twoDigit==34 || twoDigit==37))
        return true;
        else
            //'Check the first two digits first,for MasterCard
            if(CardNo.length()==16 && twoDigit>=51 && twoDigit<=55)
                return true;
        else
            //'None of the above - so check the 'first four digits collectively
                if(CardNo.length()==16 && fourDigit==6011)//for DiscoverCard
                return true;
        else

            if(CardNo.length()==16 || CardNo.length()==13 && oneDigit==4)//for VISA
                return true;
            else
                return false;       
     } 

Также вы можете сослаться на этот демонстрационный проект

Scanner.nextLong() прекратит чтение при обнаружении пробелов (или других нецифровых символов).

Например, если вход 1234 567 .. затем nextLong() будет только читать 1234,

Однако, хотя пробелы в кредитной карте, скорее всего, приведут к неудаче проверки LUHN с помощью приведенного выше кода, я не даю гарантии, что удаление пробелов сделает ее успешной - я бы использовал более надежную (и хорошо протестированную) реализация с самого начала. Нет необходимости переписывать такой код.

Другие вопросы по тегам