Android LUHN信用卡验证在有效卡号上失败
在我的应用程序中,我想检查用户是否输入了有效的卡号,因为我使用了LUHN算法。我已将其创建为方法并在mainactivity中调用。但即使我给出了有效的卡号,它也显示无效。在输入卡号时,我在两个卡号之间留了空格,我不知道,因为它不能正确验证。请帮我找出错误Android LUHN信用卡验证在有效卡号上失败,android,credit-card,luhn,Android,Credit Card,Luhn,在我的应用程序中,我想检查用户是否输入了有效的卡号,因为我使用了LUHN算法。我已将其创建为方法并在mainactivity中调用。但即使我给出了有效的卡号,它也显示无效。在输入卡号时,我在两个卡号之间留了空格,我不知道,因为它不能正确验证。请帮我找出错误 CreditcardValidation.java public class CreditcardValidation { String creditcard_validation,msg; //String mobilep
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&&twoDigitScanner.nextLong()
将在遇到空格(或其他非数字字符)时停止读取
例如,如果输入是1234567..
,则nextLong()
将只读取1234
然而,虽然信用卡中的空格[可能]会导致上面代码的LUHN验证失败,但我不能保证删除空格会使其通过-我会使用更健壮(且经过良好测试)的从一开始就实现。无需重写此类代码。有什么替代方法可以修复。我必须在between@june另外两个答案通过使用getDigitsOnly(cardNumber)
(尽管未提供实现)或使用CardNo.replace(…”)来解决此问题
。您可以遵循类似的方法,首先规范化输入,即在将其作为长文本读取并应用LUHN之前删除空格(和破折号等)。