189 lines
7.1 KiB
Java
189 lines
7.1 KiB
Java
/*
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
* To change this template file, choose Tools | Templates
|
|
* and open the template in the editor.
|
|
*/
|
|
package mp4_calebfontenot;
|
|
|
|
import java.util.Scanner;
|
|
|
|
/**
|
|
*
|
|
* @author caleb
|
|
*/
|
|
public class MP4_CalebFontenot {
|
|
|
|
static boolean debug = false;
|
|
// Yes, I know the debugger exists. This is just a bit easier imho
|
|
|
|
/**
|
|
* If the result from Step 4 is divisible by 10, the card number is valid; otherwise, it is invalid. For example, the number 4388576018402626 is invalid, but the number 4388576018410707 is valid
|
|
*
|
|
* @param CreditCard
|
|
* @return
|
|
*/
|
|
public static boolean isValid(String CreditCard) {
|
|
int sumResult = MP4_CalebFontenot.sum(MP4_CalebFontenot.doubleDigitsAndSumSingleDigits(CreditCard), MP4_CalebFontenot.addOddNumbersFromRightToLeft(CreditCard));
|
|
int divisionResult = sumResult % 10;
|
|
if (debug) {
|
|
System.out.println(sumResult + ", " + divisionResult);
|
|
}
|
|
if (divisionResult == 0) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sum the results from Steps 1, 2 and Step 3. 37 + 38 = 75
|
|
*
|
|
* @param step1andSep2 result form step 1 and step 2
|
|
* @param step3 result form step 3
|
|
* @return
|
|
*/
|
|
public static int sum(int step1andStep2, int step3) {
|
|
return step1andStep2 + step3;
|
|
}
|
|
|
|
/**
|
|
* Add all digits in the odd places from right to left in the card number. 6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38
|
|
*
|
|
* @param -creditCard the credit card number to be processed.
|
|
* @return the sum of digits at odd position from right to left.
|
|
*/
|
|
public static int addOddNumbersFromRightToLeft(String creditCard) {
|
|
if (debug) {
|
|
System.out.println("Now executing addOddNumbersFromRightToLeft()");
|
|
}
|
|
// Iterate through string
|
|
int creditCardLength = creditCard.length();
|
|
int currentDigit, digitProduct, tensDigit, onesDigit, sum = 0;
|
|
//System.out.println(creditCard.length());
|
|
|
|
for (int i = (creditCardLength - 1); i >= 0; i--) {
|
|
currentDigit = Character.getNumericValue(creditCard.charAt(i)); // Parses current digit as an integer so we can do math on it
|
|
if (currentDigit % 2 != 0) { // Is this number an odd number?
|
|
sum += currentDigit;
|
|
if (debug) {
|
|
System.out.println(currentDigit);
|
|
System.out.println("sum: " + sum);
|
|
}
|
|
}
|
|
}
|
|
|
|
return sum;
|
|
}
|
|
|
|
/**
|
|
* Double every second digit from right to left. If doubling of a digit results in a two-digit number, add up the two digits to get a single-digit number. 2 * 2 = 4 2 * 2 = 4 4 * 2 = 8 1 * 2 = 2 6 * 2 = 12 (1 + 2 = 3) 5 * 2 = 10 (1 + 0 = 1) 8 * 2 = 16 (1 + 6 = 7) 4 * 2 = 8 Step 2 Now add all single-digit numbers from Step 1. 4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37
|
|
*
|
|
* @param -creditCard the credit card number to be processed.
|
|
* @return
|
|
*/
|
|
public static int doubleDigitsAndSumSingleDigits(String creditCard) {
|
|
if (debug) {
|
|
System.out.println("Now executing doubleDigitsAndSumSingleDigits()");
|
|
}
|
|
// Iterate through string
|
|
int creditCardLength = creditCard.length();
|
|
int currentDigit, digitProduct, tensDigit, onesDigit, sum = 0;
|
|
//System.out.println(creditCard.length());
|
|
|
|
for (int i = (creditCardLength - 1); i >= 0; i--) {
|
|
if (i % 2 == 0) {
|
|
currentDigit = Character.getNumericValue(creditCard.charAt(i)); // Parses current digit as an integer so we can do math on it
|
|
if (debug) {
|
|
System.out.println("current digit: " + currentDigit);
|
|
}
|
|
digitProduct = currentDigit * 2;
|
|
if (digitProduct > 9) { // Product is larger than 9. Typecast the integer back into a string so we can seperate the digits and add them together.
|
|
String workingString = Integer.toString(digitProduct);
|
|
tensDigit = Character.getNumericValue(workingString.charAt(0));
|
|
onesDigit = Character.getNumericValue(workingString.charAt(1));
|
|
if (debug) {
|
|
System.out.println("tensDigit is " + tensDigit);
|
|
System.out.println("onesDigit is " + onesDigit);
|
|
}
|
|
digitProduct = (tensDigit + onesDigit);
|
|
}
|
|
sum += digitProduct;
|
|
}
|
|
|
|
}
|
|
if (debug) {
|
|
System.out.println("The sum is: " + sum);
|
|
}
|
|
return sum;
|
|
}
|
|
|
|
/**
|
|
* Displays Q/q or C/c. If the user enters C, it read the credit number and returns it as String. If the user types Q/q returns 0
|
|
*
|
|
* @return a string with credit card number or 0.
|
|
*/
|
|
public static String menu() {
|
|
String userInput = "";
|
|
Scanner input = new Scanner(System.in);
|
|
|
|
while (!userInput.equals("0"))//user has not entered Q/q
|
|
{
|
|
System.out.println("Press Q/q to quit");
|
|
System.out.println("Press C/c to enter a credit card");
|
|
userInput = input.next();
|
|
if (userInput.equalsIgnoreCase("q")) {
|
|
userInput = "0";
|
|
}
|
|
if (userInput.equalsIgnoreCase("c")) {
|
|
System.out.print("Please enter a credit card number: ");
|
|
userInput = input.next();
|
|
try { //Test to see if user has given us a string that looks like a credit card number
|
|
//Does it sucessfully convert to an integer?
|
|
Long.parseLong(userInput);
|
|
|
|
} catch(Exception e) {
|
|
System.out.println("Invalid input: String doesn't look like a credit card, it failed successfully convert into an integer.");
|
|
//break;
|
|
}
|
|
if (userInput.length() != 16) {
|
|
System.out.println("Invalid input: String doesn't look like a credit card, incorrect length.");
|
|
if (debug) {
|
|
System.out.println("length: " + userInput.length());
|
|
}
|
|
} else {
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
return userInput;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param args
|
|
*/
|
|
public static void main(String[] args) {
|
|
|
|
//String sampleCreditCard = "4388576018410707";
|
|
String userInput = menu();
|
|
if (userInput == "0") { // Stop program execution if credit card not entered
|
|
System.out.println("Credit card not entered!");
|
|
//System.exit(0);
|
|
return;
|
|
}
|
|
|
|
boolean creditCardValidity = MP4_CalebFontenot.isValid(userInput);
|
|
String validityString;
|
|
if (creditCardValidity) {
|
|
validityString = "valid";
|
|
} else {
|
|
validityString = "invalid";
|
|
}
|
|
|
|
System.out.println("The credit card " + userInput + " is " + validityString);
|
|
}
|
|
|
|
}
|