I'm writing an algorithm to read from a file a list of numbers, and for each, determine if it is valid. If it is, then display which card type it is.
public class CreditCardValidator {
/**
* @param args the command line arguments
* @throws java.io.FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException {
Scanner scan = new Scanner(new File(args[0])); // read from a file
while (scan.hasNextLine()) {
String str = scan.nextLine();
if (validate(str)) {
System.out.println(creditCardType(str));
} else {
System.out.println("Invalid");
}
}
}
private static boolean validate(String str) {
String reverse = new StringBuilder().append(str).reverse().toString();
int[] array = new int[str.length()];
for (int i = 0; i < array.length; i++) {
array[i] = Integer.parseInt("" + reverse.charAt(i));
}
int sum = 0;
for (int i = 0; i < array.length; i++) {
if (i % 2 == 1) {
array[i] *= 2;
if (array[i] > 9) {
array[i] -= 9;
}
}
sum += array[i];
}
return sum % 10 == 0;
}
private static String creditCardType(String str) {
int input1Char = Integer.parseInt(str.substring(0, 1));
int input2Chars = Integer.parseInt(str.substring(0, 2));
int input3Chars = Integer.parseInt(str.substring(0, 3));
int input4Chars = Integer.parseInt(str.substring(0, 4));
int input6Chars = Integer.parseInt(str.substring(0, 6));
if (input2Chars == 34 || input2Chars == 37) {
if (str.length() == 15) {
return "American Express";
}
}
if (input4Chars == 6011
|| (input6Chars >= 622126 && input6Chars <= 622925)
|| (input3Chars >= 644 && input3Chars <= 649)
|| input2Chars == 65) {
if (str.length() == 16) {
return "Discover";
}
}
if (input2Chars >= 51 && input2Chars <= 55) {
if (str.length() >= 16 && str.length() <= 19) {
return "MasterCard";
}
}
if (input1Char == 4) {
if (str.length() >= 13 && str.length() <= 16) {
return "Visa";
}
}
return "Invalid Credit Card Type";
}
}
creditCardType
, you should probably be using string matching throughout to avoid yourinputNChars
variables, which are very smelly 2) Obligatory reminder to leave credit card handling to external libraries. In general, they'll simplify your code, but with credit cards in particular, not using standard libraries might make you liable if anything goes wrong and numbers get leaked. I assume this is a sample project, though, not actual production stuff. \$\endgroup\$