2013-12-04 5 views
4

Я хотел бы запустить программу, которая может определять валидацию и тип номера кредитной карты на основе введенного числа. Компилятор показывает, что в моей кодировке есть ошибка, но я не могу определить, где она. Программа также не может быть запущена. Ниже кодирование,Тип и подтверждение кредитной карты

import java.util.*; 

    public class CreditCard { 

     public static void main(String args[]) { 
       String CType;(String number) { 
        if (number.startsWith("4")) 
         return "Visa"; 
        else if (number.startsWith("5")) 
         return "MasterCard"; 
        else if (number.startsWith("6")) 
         return "Discover"; 
        else if (number.startsWith("37")) 
         return "American Express"; 
        else 
         return "Unknown type"; 
       }; 
      Scanner input = new Scanner(System.in); 

      System.out.println("Enter a credit card number: "); 
      long number = input.nextLong(); 

      long total = sumOfEvenPlaces(number) + (sumOfOddPlaces(number)*2); 

      if (isValid(total)) { 
       System.out.println("The "+CType+" card number is valid"); 
      } else { 
       System.out.println("The "+CType+" card number is invalid."); 
      } 
     } 



     public static boolean isValid(long total) { 
      if (total % 10 != 0) { 
      } else { 
         return true; 
       } 
      return false; 
     } 

     public static int sumOfEvenPlaces(long number) { 
      int sum = 0; 
      int remainder; 
      while (number % 10 != 0 || number/10 != 0) { 
       remainder = (int) (number % 10); 

       sum = sum + getDigit(remainder * 2); 
       number /= 100; 
      } 
      return sum; 
     } 

     public static int getDigit(int number) { 
      if (number > 9) { 
       return (number % 10 + number/10); 
      } 
      return number; 
     } 

     public static int sumOfOddPlaces(long number) { 
      int sum = 0; 
      int remainder; 
      number /= 10; 
      while (number % 10 != 0 || number/10 != 0) { 
       remainder = (int) (number % 10); 
       sum = sum + getDigit(remainder * 2); 
       number /= 100; 
      } 
      return sum; 
     } 
    } 
+2

Где компилятор говорит об ошибке? или просто то, что компилятор говорит вообще? пожалуйста, сообщите об этом в свой вопрос. – Vallentin

+5

String CType; (String number) {<--- Что это? – Ben

ответ

0

Это может быть больше вдоль линий того, что вы пытаетесь сделать:

public static void main(final String args[]) 
    { 
     String cType = null; 

     System.out.println("Enter a credit card number: "); 
     final Scanner input = new Scanner(System.in); 
     final String cardNumber = input.next(); 

     if (cardNumber.startsWith("4")) 
     { 
      cType = "Visa"; 
     } 
     else if (cardNumber.startsWith("5")) 
     { 
      cType = "MasterCard"; 
     } 
     else if (cardNumber.startsWith("6")) 
     { 
      cType = "Discover"; 
     } 
     else if (cardNumber.startsWith("37")) 
     { 
      cType = "American Express"; 
     } 
     else 
     { 
      cType = "Unknown type"; 
     } 

     final long total = sumOfEvenPlaces(Long.valueOf(cardNumber)) + (sumOfOddPlaces(Long.valueOf(cardNumber)) * 2); 

     if (isValid(total)) 
     { 
      System.out.println("The " + cType + " card number is valid"); 
     } 
     else 
     { 
      System.out.println("The " + cType + " card number is invalid."); 
     } 
    } 

На стилистической ноте CType должно начинаться с буквы нижнего регистра (например, cType). Вам придется поэкспериментировать с использованием Scanner, а также я не уверен, что моя реализация сделает то, что вы ищете.

+0

И это было бы хорошим местом для [оператора switch] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html) – eebbesen

18

я определение типа карты с перечислением:

package com.gabrielbauman.gist; 

import java.util.regex.Pattern; 

public enum CardType { 

    UNKNOWN, 
    VISA("^4[0-9]{12}(?:[0-9]{3}){0,2}$"), 
    MASTERCARD("^(?:5[1-5]|2(?!2([01]|20)|7(2[1-9]|3))[2-7])\\d{14}$"), 
    AMERICAN_EXPRESS("^3[47][0-9]{13}$"), 
    DINERS_CLUB("^3(?:0[0-5]\d|095|6\d{0,2}|[89]\d{2})\d{12,15}$"), 
    DISCOVER("^6(?:011|[45][0-9]{2})[0-9]{12}$"), 
    JCB("^(?:2131|1800|35\\d{3})\\d{11}$"), 
    CHINA_UNION_PAY("^62[0-9]{14,17}$"); 

    private Pattern pattern; 

    CardType() { 
     this.pattern = null; 
    } 

    CardType(String pattern) { 
     this.pattern = Pattern.compile(pattern); 
    } 

    public static CardType detect(String cardNumber) { 

     for (CardType cardType : CardType.values()) { 
      if (null == cardType.pattern) continue; 
      if (cardType.pattern.matcher(cardNumber).matches()) return cardType; 
     } 

     return UNKNOWN; 
    } 

} 

Вы можете сделать CardType.detect("cardnumbergoeshere"), и вы получите обратно CardType.VISA и т.д.

Там есть тестовый модуль над на the gist.

Для проверки, у меня есть:

public boolean isValid(String cardNumber) { 
    int sum = 0; 
    boolean alternate = false; 
    for (int i = cardNumber.length() - 1; i >= 0; i--) { 
     int n = Integer.parseInt(cardNumber.substring(i, i + 1)); 
     if (alternate) { 
      n *= 2; 
      if (n > 9) { 
       n = (n % 10) + 1; 
      } 
     } 
     sum += n; 
     alternate = !alternate; 
    } 
    return (sum % 10 == 0); 
} 

Это должно сделать это.

+1

Это очень помогло мне! Я [разветвил суть] (https://gist.github.com/LionC/a0fa374df1770b8a58ea6e1cb0a9c845), чтобы добавить поддержку платформ China Union Pay, возможно, вы хотите отредактировать их в своем ответе :-) – LionC

+0

Рад, что это помогло! –

+1

С тех пор некоторые диапазоны карт увеличились. Я обновил Discover и VISA, потому что это были лишь незначительные изменения. MasterCard теперь также имеет 2221-2720, поэтому я использовал '^ (?: 5 [1-5] | 2 (?! 2 ([01] | 20) | 7 (2 [1-9] | 3)) [2 -7]) \\ d {14} $ 'и для Diner's Club'^3 (?: 0 [0-5] \ d | 095 | 6 \ d {0,2} | [89] \ d {2}) \ д {12,15} $ '. Отличный ответ, хотя! – Gary

Смежные вопросы