package com.idega.util;
import java.util.List;
/**
* Creditcardnumber checker <br>
* Visa <br>
* MasterCard <br>
* American Express <br>
* Diner's Club <br>
* Discover <br>
* en Route <br>
**/
public class CreditCardChecker {
public static void main(String[] args) {
String number = "377846032140106";
System.out.println(isValid(number));
System.out.println(getCardType(number).getCode() + ": " + getCardType(number).getName());
}
/**
* Valid a Credit Card number
*/
public static boolean isValid(String number) {
if (getCardType(number) != CreditCardType.INVALID)
return validCCNumber(number);
return false;
}
/**
* Validate a credit card number with allowed card types.
*
* @param number
* @param allowedTypes
* @return
*/
public static boolean isValid(String number, List<CreditCardType> allowedTypes) {
CreditCardType type = getCardType(number);
if (!allowedTypes.contains(type)) {
return false;
}
return validCCNumber(number);
}
public static boolean isNumber(String n) {
try {
Double.valueOf(n).doubleValue();
return true;
}
catch (NumberFormatException e) {
e.printStackTrace();
return false;
}
}
public static boolean validCCNumber(String n) {
try {
/*
* * known as the LUHN Formula (mod10)
*/
int j = n.length();
String[] s1 = new String[j];
for (int i = 0; i < n.length(); i++)
s1[i] = "" + n.charAt(i);
int checksum = 0;
for (int i = s1.length - 1; i >= 0; i -= 2) {
int k = 0;
if (i > 0) {
k = Integer.valueOf(s1[i - 1]).intValue() * 2;
if (k > 9) {
String s = "" + k;
k = Integer.valueOf(s.substring(0, 1)).intValue()
+ Integer.valueOf(s.substring(1)).intValue();
}
checksum += Integer.valueOf(s1[i]).intValue() + k;
} else
checksum += Integer.valueOf(s1[0]).intValue();
}
return ((checksum % 10) == 0);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static CreditCardType getCardType(String cardnumber) {
CreditCardType valid = CreditCardType.INVALID;
String digit1 = cardnumber.substring(0, 1);
String digit2 = cardnumber.substring(0, 2);
String digit3 = cardnumber.substring(0, 3);
String digit4 = cardnumber.substring(0, 4);
if (isNumber(cardnumber)) {
/*
* ----* VISA prefix=4* ---- length=13 or 16 (can be 15 too!?!
* maybe)
*/
if (digit1.equals("4")) {
if (cardnumber.length() == 13 || cardnumber.length() == 16)
valid = CreditCardType.VISA;
}
/*
* ----------* MASTERCARD prefix= 51 ... 55* ---------- length= 16
*/
else if (digit2.compareTo("51") >= 0 && digit2.compareTo("55") <= 0) {
if (cardnumber.length() == 16)
valid = CreditCardType.MASTERCARD;
}
/*
* ----* AMEX prefix=34 or 37* ---- length=15
*/
else if (digit2.equals("34") || digit2.equals("37")) {
if (cardnumber.length() == 15)
valid = CreditCardType.AMERICAN_EXPRESS;
}
/*
* -----* ENROU prefix=2014 or 2149* ----- length=15
*/
else if (digit4.equals("2014") || digit4.equals("2149")) {
if (cardnumber.length() == 15)
valid = CreditCardType.EN_ROUTE;
}
/*
* -----* DCLUB prefix=300 ... 305 or 36 or 38* ----- length=14
*/
else if (digit2.equals("36")
|| digit2.equals("38")
|| (digit3.compareTo("300") >= 0 && digit3.compareTo("305") <= 0)) {
if (cardnumber.length() == 14)
valid = CreditCardType.DINERS_CLUB;
}
}
return valid;
}
}