import java.io.BufferedReader;
import java.io.InputStreamReader;
public class CCUtils {
  public static final int INVALID          = -1; 
  public static final int VISA             = 0;
  public static final int MASTERCARD       = 1;
  public static final int AMERICAN_EXPRESS = 2;
  public static final int EN_ROUTE         = 3;
  public static final int DINERS_CLUB      = 4;
  private static final String [] cardNames =
      {   "Visa" ,
          "Mastercard",
          "American Express",
          "En Route",
          "Diner's CLub/Carte Blanche",
      };
       
  /**
   * Valid a Credit Card number
   */
  public static boolean validCC(String number)
    throws Exception {  
    int CardID;
    if ( (CardID = getCardID(number)) != -1)
        return validCCNumber(number);
    return false;
    }
   
  /**
   * Get the Card type
   * returns the credit card type
   *      INVALID          = -1; 
   *      VISA             = 0;
   *      MASTERCARD       = 1;
   *      AMERICAN_EXPRESS = 2;
   *      EN_ROUTE         = 3;
   *      DINERS_CLUB      = 4;
   */
  public static int getCardID(String number) {
    int valid = INVALID;
       
    String digit1 = number.substring(0,1);
    String digit2 = number.substring(0,2);
    String digit3 = number.substring(0,3);
    String digit4 = number.substring(0,4);
   
    if (isNumber(number)) {
      /* ----
      ** VISA  prefix=4
      ** ----  length=13 or 16  (can be 15 too!?! maybe)
      */
      if (digit1.equals("4"))  { 
        if (number.length() == 13 || number.length() == 16)
           valid = VISA;
        }
      /* ----------
      ** MASTERCARD  prefix= 51 ... 55
      ** ----------  length= 16
      */
      else if (digit2.compareTo("51")>=0 && digit2.compareTo("55")<=0) {
        if (number.length() == 16)
           valid = MASTERCARD;
        }
      /* ----
      ** AMEX  prefix=34 or 37
      ** ----  length=15
      */
      else if (digit2.equals("34") || digit2.equals("37")) {
        if (number.length() == 15)
           valid = AMERICAN_EXPRESS;
        }
      /* -----
      ** ENROU prefix=2014 or 2149
      ** ----- length=15
      */
      else if (digit4.equals("2014") || digit4.equals("2149")) {
         if (number.length() == 15)
            valid = 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 (number.length() == 14)
           valid = DINERS_CLUB;
           }
      }          
      return valid;
     
      /* ----
      ** DISCOVER card prefix = 60
      ** --------      lenght = 16
      **      left as an exercise ...
      */
     
    }
   
  public static boolean isNumber(String n) {
    try  {
      double d = Double.valueOf(n).doubleValue();
      return true;
      }
    catch (NumberFormatException e) {
      e.printStackTrace();
      return false;
      }
    }
  public static String getCardName(int id) {
    return (id > -1 && id < cardNames.length ? cardNames[id] : "");
    }
 
  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;
      }
    }
  /*
  ** For testing purpose
  **
  **   java CCUtils [credit card number] or java CCUtils
  **
  */
  public static void main(String args[]) throws Exception {
    String aCard = "";
   
    if (args.length > 0)
      aCard = args[0];
    else {
      BufferedReader input =
        new BufferedReader(new InputStreamReader(System.in));
      System.out.print("Card number : ");
      aCard = input.readLine();
      }
    if (getCardID(aCard) > -1) {
       System.out.println("This card is supported.");
       System.out.println("This a " + getCardName(getCardID(aCard)));
       System.out.println
         ("The card number " + aCard + " is "
           + (validCC(aCard)?" good.":" bad."));
       }
    else
       System.out.println("This card is invalid or unsupported!");
    }
}
 
 
Nenhum comentário:
Postar um comentário