Domanda

I am at the last step to finalize my program, however whenever I enter my integer (long) I get a input mismatch:

Compiler message: "Exception in thread "main" java.util.InputMismatchException: For input               string: "4388576018402626"
at java.util.Scanner.nextInt(Scanner.java:2097)
at java.util.Scanner.nextInt(Scanner.java:2050)
at CreditCardValidation.main(CreditCardValidation.java:12)"

My code is as follows:

import java.util.Scanner ; //import Scanner

public class CreditCardValidation {

public static void main (String[] args){

    Scanner kbd = new Scanner(System.in) ;

    System.out.println("Please enter Creditcard number: " ) ;

    int credNumber = kbd.nextInt() ;

    boolean n = isValid( credNumber ) ;

if (credNumber == 0 )
    System.exit(0) ;

do {                

    System.out.println("Please enter Creditcard number: " ) ;
    credNumber = kbd.nextInt() ;
    }
    while ( credNumber < 0 ) ;

if (credNumber > 0 )
    System.out.print("This credit card number is " + n ) ;




}

/*
Return true is the number is a valid card number.
*/

public static boolean isValid(long number) {


    long p = getPrefix(number, 1);
    long p2 = getPrefix(number, 2);
    int n = getSize(number);


    if ((p == 4 || p == 5 || p == 6 || p2 == 37)&& (n < 13 || n > 16) && (((sumOfDoubleEvenPlace(number) + sumOfoddPlace(number))) % 10) == 0)
        return true ;
    else
        return false ;

}


/* The sum of every other digit, doubled, starting with the first digit. */

public static int sumOfDoubleEvenPlace(long number) {
    int sum = 0;
    int maxDigitLenth = 16;
    for (int i = 1; i <= maxDigitLenth; i++)
    {
        if (i % 2 == 0)
        {
            sum = sum + getDigit((int)(number % 10) * 2);
        }
        number /= 10;
    }
    return sum;
}

/*
Return the number if it is 0-9, otherwise return the sum of
the digits of the number.
*/

public static int getDigit(int number) {
    if (number < 10) {

        return number;
    }
    else {

        return (number / 10) + (number % 10);
    }

    }
/*
Return the sum of the odd-place digits.
*/

public static int sumOfoddPlace(long number) {
    int maxDigitLength = 16;
    int sum = 0;
    for (int i = 1; i <= maxDigitLength; i++)
    {

        if (i % 2 == 1)
        {
            sum = sum + (int)(number % 10);
        }
       number /= 10;
    }
    return sum;
}

/*
Return the number of digits in d
*/

public static int getSize(long d) {

    int size = 0 ;

    while( d > 0 ) {
        d = d / 10 ;
        size = size + 1 ;       
    }
    return size ;
}

/*
Return the first k number of digits from number. If the number of digits in number is 
less than k, return the number.
*/

public static long getPrefix(long n, int k) {

    int f = getSize(n)-k;

    long prefix = n/((long)(Math.pow(10, f)));

    return prefix;
    }

/*
Return true if the digit d is a prefix for number.
*/

public static boolean prefixMatched( long number, int d ) {

    if ( d == getPrefix(number, 4))

        return true ;
    else
        return false ;

    }

}

Thank you for your time!

È stato utile?

Soluzione

That is because the value you're entering is beyond the range of integer values. You need to use long in this case. The max value of integer is 2147483647.

long credNumber = kbd.nextLong();
..
// in the do while loop also
credNumber = kbd.nextLong() ;

Altri suggerimenti

The maximum Integer value is 2147483647. Instead, use long:

long credNumber = kbd.nextLong();

or better use String for credit card number:

String credNumber = kbd.nextLine();

You should use:

long credNumber = kbd.nextLong();
boolean n = isValid(credNumber);

as the value you enter (16 digits) is over the limit of int.

Your validation method accepts long so, your code should work fine with above change.

public static boolean isValid(long number)

You can also convert your int to BigInteger and then call the add function on BigInteger objects

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top