Android LUHN信用卡验证在有效卡号上失败

Android LUHN信用卡验证在有效卡号上失败,android,credit-card,luhn,Android,Credit Card,Luhn,在我的应用程序中,我想检查用户是否输入了有效的卡号,因为我使用了LUHN算法。我已将其创建为方法并在mainactivity中调用。但即使我给出了有效的卡号,它也显示无效。在输入卡号时,我在两个卡号之间留了空格,我不知道,因为它不能正确验证。请帮我找出错误 CreditcardValidation.java public class CreditcardValidation { String creditcard_validation,msg; //String mobilep

在我的应用程序中,我想检查用户是否输入了有效的卡号,因为我使用了LUHN算法。我已将其创建为方法并在mainactivity中调用。但即使我给出了有效的卡号,它也显示无效。在输入卡号时,我在两个卡号之间留了空格,我不知道,因为它不能正确验证。请帮我找出错误

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();``
CreditcardValidation.java
公共类信用卡验证{
字符串信用卡验证,msg;
//字符串移动模式;
公共静态布尔值isValid(长数字){
int total=SUMOOFDOUBLEEVENPLACE(数字)+SUMOOFODPLACE(数字);
如果((总计%10==0)&&(预匹配(数字,1)==true)&&(getSize(数字)>=16)&&(getSize(数字)0){
温度=数量%100;
结果+=getDigit((int)(温度/10)*2);
数量=数量/100;
}
返回结果;
}
公共静态布尔前缀匹配(长数字,int d){
if((getPrefix(number,d)==5)
||(getPrefix(数字,d)==4)
||(getPrefix(数字,d)==3)){
if(getPrefix(number,d)==4){
System.out.println(“\nVisa卡”);
}else if(getPrefix(number,d)==5){
System.out.println(“\n主卡”);
}else if(getPrefix(number,d)==3){
System.out.println(“\nAmerican快递卡”);
}
返回true;
}否则{
返回false;
}
}
公共静态int getSize(长d){
整数计数=0;
而(d>0){
d=d/10;
计数++;
}
返回计数;
}
公共静态长getPrefix(长数字,整数k){
if(getSize(number)
参考下面的代码

 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;       
     } 
EditText cardname=(EditText)findviewbyd(R.id.cardname);
字符串CreditCardType=“未知”;
///从传递的字符串中删除所有空格和破折号
字符串CardNo=“9292304336”;///cardNumber.getText().toString();
CardNo=CardNo.replace(“,”);//删除空白
CardNo=CardNo.replace(“-”,”);//删除“-”
twoDigit=Integer.parseInt(CardNo.substring(0,2));
System.out.println(“------------两位数--”+两位数);
四位数=整数.parseInt(CardNo.substring(0,4));
System.out.println(“------------四位数--”+四位数);
一位数=整数.parseInt(Character.toString(CardNo.charAt(0));
System.out.println(“------------一位数--”+一位数);
布尔验证=假;
//'检查字符串的最小长度是否不等于14)
{
cardValidation=cardValidationMethod(CardNo);
}
布尔cardValidationMethod(字符串CardNo)
{
//'首先检查AmericanExpress的前两位数字
if(CardNo.length()=15&&(两位数==34 | |两位数==37))
返回true;
其他的
//'首先检查万事达卡的前两位数字
如果(CardNo.length()==16&&twoDigit>=51&&twoDigit
Scanner.nextLong()
将在遇到空格(或其他非数字字符)时停止读取

例如,如果输入是
1234567..
,则
nextLong()
将只读取
1234


然而,虽然信用卡中的空格[可能]会导致上面代码的LUHN验证失败,但我不能保证删除空格会使其通过-我会使用更健壮(且经过良好测试)的从一开始就实现。无需重写此类代码。

有什么替代方法可以修复。我必须在between@june另外两个答案通过使用
getDigitsOnly(cardNumber)
(尽管未提供实现)或使用
CardNo.replace(…”)来解决此问题
。您可以遵循类似的方法,首先规范化输入,即在将其作为长文本读取并应用LUHN之前删除空格(和破折号等)。