我用Java创建了这个Luhn Check(或Mod 10检查),偶数和奇数总和没有正确加起来,我无法弄清楚为什么。当我单独编写一个部分并且它似乎工作正常时,它工作。作为一个包含所有其他方法的整个程序,它不起作用。有人有什么想法吗?
输入电话号码4388576018410707应该有效。
import java.util.Scanner;
import java.io.*;
public class combineAll {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter a credit card number: ");
long userInput = input.nextLong();
int getSize=getSize(userInput); //Run getSize() Method.
Integer z = (int) (long) getPrefix(userInput, getSize); //Run getPrefix() Method.
if (prefixMatch(userInput, z)== true) { //Run prefixMatch() Method.
long n=sumbOfDoubleEvenPlace(userInput); //Run sumbOfDoubleEvenPlace() Method.
long m=sumOfOddPlace(userInput); //Run sumOfOddPlace() Method.
System.out.println("Total Even: " +n);
System.out.println("Total Odd: " +m);
long v=n+m;
if (isValid(v)==true) {
System.out.println("Valid");
} else if (isValid(v)==false){
System.out.println("Invalid");
}
} else {
System.out.println("Invalid");
}
} //End main
//Return the number of digits in d
public static int getSize(long d) {
String str = Long.toString(d);
int x = str.length();
return x;
}
//Return the first k number of digits from number. If the number of digits in number is less than k, return number
public static long getPrefix(long number, int k) {
int z=0;
if (k>=13 && k<=16) {
String str = Long.toString(number);
String g = str.substring(0,1);
String h = str.substring(0,2);
int d=Integer.parseInt(g);
int q=Integer.parseInt(h);
if (d==4 || d==5 ||d==6) {
z=d;
} else if (q==37) {
z=q;
}
} else {
z=-1;
}
return z;
}
//Return true if the digit d is a prefix for number
public static boolean prefixMatch(long number, int d) {
if (d==4 || d==5 || d==6 || d==37) {
return true;
} else {
return false;
}
}
//Get the result from step 2
public static int sumbOfDoubleEvenPlace(long number) {
long a=number;
int d=0; //Adds each individual numbers.
while (a>0) {
long b=0;
long c=0; //Equals the Mod of UserInput.
a=a/10;
c=a%10;
System.out.println("even: " +c);
b=c*2;
if (b>=10) {
Integer digit = (int) (long) b;
d+=getDigit(digit); //Run getDigit() Method.
} else {
Integer digit = (int) (long) b;
d+=b;
}
a=a/10; //Advance decimal one space to the left.
}
return d;
}
//Return sum of odd-place digits in number
public static int sumOfOddPlace(long number) {
long a=number;
int d=0; //Adds each individual numbers.
while (a>0) {
long b=0;
long c=0; //Equals the Mod of UserInput.
c=a%10;
System.out.println("odd: " +c); //Print for debugging.
b=c*2;
if (b>=10) {
Integer digit = (int) (long) b;
d+=getDigit(digit); //Run getDigit() Method.
} else {
Integer digit = (int) (long) b;
d+=b;
}
a=a/10; //Advance decimal one space to the left.
a=a/10;
}
return d;
}
//Return this number if it is a single digit, otherwise return the sum of the two digits
public static int getDigit(int number) {
int d=0;
int x=0;
int y=number;
while (y>0) {
x+=y%10;
y=y/10;
}
return x;
}
//Return true if the card number is valid
public static boolean isValid(long number) {
long c=number%10;
if (c==0) {
return true;
} else {
return false;
}
}
}
答案 0 :(得分:0)
代码有点难以理解。基于算法描述形式Wikipedia,实现应该更简单。 Here是遵循Wikipedia的说明中的其他实现。
public class Cards {
/**
* Checks if the card is valid
*
* @param card
* {@link String} card number
* @return result {@link boolean} true of false
*/
public static boolean luhnCheck(String card) {
if (card == null)
return false;
char checkDigit = card.charAt(card.length() - 1);
String digit = calculateCheckDigit(card.substring(0, card.length() - 1));
return checkDigit == digit.charAt(0);
}
/**
* Calculates the last digits for the card number received as parameter
*
* @param card
* {@link String} number
* @return {@link String} the check digit
*/
public static String calculateCheckDigit(String card) {
if (card == null)
return null;
String digit;
/* convert to array of int for simplicity */
int[] digits = new int[card.length()];
for (int i = 0; i < card.length(); i++) {
digits[i] = Character.getNumericValue(card.charAt(i));
}
/* double every other starting from right - jumping from 2 in 2 */
for (int i = digits.length - 1; i >= 0; i -= 2) {
digits[i] += digits[i];
/* taking the sum of digits grater than 10 - simple trick by substract 9 */
if (digits[i] >= 10) {
digits[i] = digits[i] - 9;
}
}
int sum = 0;
for (int i = 0; i < digits.length; i++) {
sum += digits[i];
}
/* multiply by 9 step */
sum = sum * 9;
/* convert to string to be easier to take the last digit */
digit = sum + "";
return digit.substring(digit.length() - 1);
}
public static void main(String[] args) {
String pan = "4388576018410707";
System.out.println("Validate pan number '" + pan + "': " + luhnCheck(pan2));
}
}