package Q3; import java.util.*; public class CreditCard { private int evenSum; private int oddSum; private int sum; private String ccNumber; private String company; public CreditCard(String num) { this.ccNumber = num; this.company = this.identifyCompany(num); this.calculateSums(num); } public int getEvenSum() { return evenSum; } public int getOddSum() { return oddSum; } public int getSum() { return sum; } public String getCcNumber() { return this.ccNumber; } public String getCompany() { return this.company; } public boolean isValid() { return this.validateCompany() && this.validateLength() && this.validateNumber() && this.validateSums() && this.isDivisibleBy10(); } public boolean isDivisibleBy10() { return ((this.evenSum + this.oddSum) % 10) == 0; } public boolean validateCompany() { return this.ccNumber.startsWith("4") || this.ccNumber.startsWith("5") || this.ccNumber.startsWith("37") || this.ccNumber.startsWith("6"); } public boolean validateLength() { return this.ccNumber.length() >= 13 && this.ccNumber.length() <= 16; } public boolean validateNumber() { for (int i = 0; i < this.ccNumber.length(); i++) if (!Character.isDigit(this.ccNumber.charAt(i))) return false; return true; } public boolean validateSums() { return this.evenSum > 0 && this.oddSum > 0; } private String identifyCompany(String number) { if (validateCompany()) switch (number.charAt(0)) { case '3': return "American Express"; case '4': return "Visa"; case '5': return "MasterCard"; case '6': return "Discover"; } return "Unknown"; } private void calculateSums(String number) { if (!validateNumber()) return; String reversed = this.reverseString(number); for (int i = 0; i < reversed.length(); i++) { int digit = this.digitFrom(reversed, i); if (this.isOdd(i + 1)) this.oddSum += digit; else { String value = String.valueOf(digit * 2); for (int j = 0; j < value.length(); j++) this.evenSum += this.digitFrom(value, j); } } } private String reverseString(String value) { return new StringBuilder(value).reverse().toString(); } private boolean isEven(int number) { return number % 2 == 0; } private boolean isOdd(int number) { return !this.isEven(number); } private int digitFrom(String input, int index) { return Character.getNumericValue(input.charAt(index)); } public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Enter credit card #:"); CreditCard creditCard = new CreditCard(in.next()); if (creditCard.isValid()) System.out.println( String.format("%s is offerred by %s", creditCard.getCcNumber(), creditCard.getCompany())); else System.out.println(String.format("%s in invalid", creditCard.getCcNumber())); } }