Credit Card String Program
Code :
public class CreditCardNumber {
private String issuerID = "000000";
private String accountNum = "999999999";
private int checkDigit;
public CreditCardNumber(String tempIssuerID, String tempAccountNum) {
if (tempIssuerID != null && tempAccountNum != null
&& tempIssuerID.length() == 6 && tempAccountNum.length() == 9)
if (checkDigits(tempIssuerID) && checkDigits(tempAccountNum)) {
issuerID = tempIssuerID;
accountNum = tempAccountNum;
calcCheckDigits();
}
}
public CreditCardNumber() {
issuerID = "000000";
accountNum = "999999999";
//checkDigit = 0;
}
public boolean checkDigits(String temp) {
char digit;
for(int i = 0; i < temp.length(); i++){
digit = temp.charAt(i);
if(digit < '0')
return false;
if (digit > '9')
return false;
}
return true;
}
public String getIssuerID() {
return issuerID;
}
public String getAccountNum() {
return accountNum;
}
public int getCheckDigits() {
return checkDigit;
}
private void calcCheckDigits() {
int sum;
sum = checkSum();
if ((sum + checkDigit) % 10 == 0) {
checkDigit = sum + (sum % 10);
}
}
public void createCard(String tempIssuerID) {
if (tempIssuerID != null && tempIssuerID.length() == 6
&& checkDigits(tempIssuerID)) {
issuerID = tempIssuerID;
} else {
issuerID = "000000";
}
StringBuilder tempString = new StringBuilder();
for (int i = 0; i < 9; i++) {
tempString = tempString.append((Math.random() * 9));
}
accountNum = tempString.toString();
calcCheckDigits();
}
private int checkSum() {
StringBuilder temp = new StringBuilder();
int num;
int sum = 0;
for(int i = 0 ; i < issuerID.length(); i++){
temp = temp.append(issuerID.charAt(i));
for(int j = 0 ; j < accountNum.length(); j++){
temp = temp.append(accountNum.charAt(j));
}
}
for (int k = 0; k < temp.length(); k +=2) {
num = temp.charAt(k);
num *= 2;
if (num >= 10)
num = (num % 10) + 1;
temp.setCharAt(k, (char)num);
sum += num;
}
return sum;
}
public String toString() {
String str = issuerID + accountNum + checkDigit;
return str;
}
}
In another file:
Code :
import java.util.Scanner;
public class Prog4 {
static Scanner scanner = new Scanner(System.in);
public static void main(String[] args){
CreditCardNumber[] objArray;
CreditCardNumber objCred = getUserInput();
displayCred("The complete number from your input:", objCred);
objArray= getInputArray();
displayArray(objArray);
tryAnother(objArray);
}
public static CreditCardNumber getUserInput() {
String ID;
String accountNum;
CreditCardNumber userNum;
System.out.printf("Please enter issuer ID: ");
ID = scanner.nextLine();
System.out.printf("Please enter account number: ");
accountNum = scanner.nextLine();
userNum = new CreditCardNumber(ID, accountNum);
return userNum;
}
public static void displayCred(String ch, CreditCardNumber cred){
System.out.println(ch);
System.out.println(cred.toString().replaceAll(".{4}", "$0 "));
}
public static CreditCardNumber[] getInputArray(){
int size;
CreditCardNumber[] tempAry;
String tempID;
System.out.printf("Please enter size of the array: ");
size = scanner.nextInt();
if(size < 1) {
size = 1;
}
tempAry = new CreditCardNumber[size];
System.out.printf("Please enter issuer ID# (6 digits): ");
tempID = scanner.next();
for(int i = 0; i < tempAry.length; i++){
tempAry[i] = new CreditCardNumber();
tempAry[i].createCard(tempID);
}
return tempAry;
}
public static void displayArray(CreditCardNumber[] objArray){
for(int i = 0; i < objArray.length; i++){
displayCred("Credit Card # " + i + ":" + '\n', objArray[i]);
}
System.out.println();
}
public static boolean tryAnother(CreditCardNumber[] cred1) {
String s;
System.out.printf("Get more credit card numbers? (n for no):");
s = scanner.next();
if(s.charAt(0) != 'N' && s.charAt(0) != 'n'){
cred1 = getInputArray();
displayArray(cred1);
if(s.charAt(0) != 'N' && s.charAt(0) != 'n')
tryAnother(cred1);
}
return false;
}
}
Desired output:
Enter a credit card issuer number: 321321
Enter an account number: 654654654
The complete number from your input:
3213 2165 4654 6549
Enter the number of elements in the array: 1
Enter an issuer ID# (6 digits): 789789
Credit Card # 0:
7897 8931 4062 1219
However when I run my code I have two problems.
1. For the complete number from input part, I my card number looks good except for the very last digit(its always a 0).
I've tried editing multiple things to fix this but have had no luck.
2. For my array printing credit card number, I just get a giant mess:
Credit Card # 0:
9879 878. 0511 2471 8666 2488 .625 2980 5398 0805 8.93 4724 9421 1246 52.1 0708 2984 6066 88.7 3952 9333 1195 260. 8686 9691 2926 3099 5.31 4072 8376 3121 .706 0624 4425 2281 48.3 2209 1522 6689 480
-pretty much until the console runs out of room.
Please help me out! I'm so close to finishing, and feel like this is probably something trivial that I am just not seeing.
Thank you for your time and please let me know if you need additional details.
Re: Credit Card String Program
Quote:
the very last digit(its always a 0).
Where is the code that creates that last digit? How have you tried to debug it so you'd understand why the digit is always 0? Add a println statement to print out the values of the variables used to create that last digit so you can see why it is 0.
Re: Credit Card String Program
Hmmm its made from my checkSum method.... but I cannot understand how my sum could end up being zero. Everything looks good to me. I guess I'll try tinkering with it some more.
--- Update ---
Hmmm its made from my checkSum method.... but I cannot understand how my sum could end up being zero. Everything looks good to me. I guess I'll try tinkering with it some more.
So it looks like it is checkSum. The sum that I am returning ends up being 194 no matter how many times I run the program. But I don't know how to fix this. Any ideas or suggestions?
Re: Credit Card String Program
What prints out when the debugging println statements are executed?
Can you provide all the input that the user must make to test the program?
An easy way to make sure the program reads the right data is to preload the user's input by having a String for the Scanner class's constructor:
Code :
static Scanner scanner = new Scanner("put user input here");
Here's a sample:
Code :
static Scanner scanner = new Scanner("123456789\n7\n88\n99\n766\n");
Having the full input in the code makes sure all testing uses the same data AND makes testing much EASIER.
Re: Credit Card String Program
My debugging println statement was used to print out the sum right before it is returned from the method chechSum. I provided the user input used in running the program in my very first post. Here it is just in case again:
Enter a credit card issuer number: 321321
Enter an account number: 654654654
The complete number from your input:
3213 2165 4654 6549
Enter the number of elements in the array: 1
Enter an issuer ID# (6 digits): 789789
Credit Card # 0:
7897 8931 4062 1219
-This also has the correct output according to what the use typed in. Again, my current output doesn't really look like this. The specific couple of miss matches and errors I have were posted in my very first post.
Re: Credit Card String Program
Can you change the Scanner definition as I showed above in post #4 so that it provides the answers to the questions that the program asks. With that change there will be no chance a user can enter the wrong data and will make sure that we test with the same data that you are testing with.
Just post the Scanner definition to use, not the whole program.
With that change to the Scanner definition, execute the code, copy the print out from the program here and add some comments to the print out that says what is wrong with it.
Re: Credit Card String Program
Okay here is my new scanner definition:
Code :
static Scanner scanner = new Scanner("321321\n654654654\n2\n987987\nn");
And my resulting output from it(still has the debugging println for sum):
Please enter issuer ID: Please enter account number: Sum =194
The complete number from your input:
3213 2165 4654 6540 //last digit should be 9
Please enter size of the array: Please enter issuer ID# (6 digits): Sum =2532
Sum =2619
Credit Card # 0: // obviously no credit card number can look like whats below. Its supposed to use an issuer Id provided by user in order to create random credit card numbers.
9879 874. 1957 2020 0249 4630 .230 8979 5936 6537 686. 9324 5354 6494 0850 .580 6082 2567 8525 0.86 0127 2669 4060 165. 7792 1235 4782 9430 .589 5794 6431 3558 30.2 6711 0495 8269 1488 .865 4594 1953 6684 5.25 3117 3757 9904 10
Credit Card # 1:
9879 873. 9525 4553 0084 0986 .375 9792 9317 9106 4.49 9005 8484 7638 82.8 8416 4824 0961 9232 .818 6822 0966 4826 78.4 8417 5603 9336 641. 4951 9384 9440 5834 2.30 6253 8161 3130 782. 0691 3425 8678 8637 1.28 1691 4240 0613 830
Get more credit card numbers? (n for no):
Re: Credit Card String Program
Where is the variable: checkDigit assigned a value? Is that line of code executed?
To see, change this line:
Code :
private int checkDigit = -1; //<<<<<<<<<<<
and see what prints out
Quote:
Its supposed to use an issuer Id provided by user in order to create random credit card numbers.
What is the output following Credit Card # 0: supposed to be?
Re: Credit Card String Program
checkDigit is assigned inside of the method calcCheckDigits. But it relies on sum, which I'm pretty sure is wrong.
If I assign chechDigit to -1 like you specified, the new output I get looks like this:
The complete number from your input:
3213 2165 4654 654- 1
--- Update ---
checkDigit is assigned inside of the method calcCheckDigits. But it relies on sum, which I'm pretty sure is wrong.
If I assign chechDigit to -1 like you specified, the new output I get looks like this:
The complete number from your input:
3213 2165 4654 654- 1
Re: Credit Card String Program
Quote:
3213 2165 4654 654- 1
That means the code never assigns a value to checkDigit. Time for some debugging to see why it does not assign a value.
Re: Credit Card String Program
I think it assigns a value, just not the right one because sum is completely off and too large... But I don't know where the logic in the code is wrong.
Re: Credit Card String Program
Quote:
I think it assigns a value
It can NOT assign a value because it does not change the initial value of -1.
Add a call to the println method (as suggest earlier in post#2) to print out a message with the values used to assign checkDigit a value when it is assigned a value to see what happens and why.
Re: Credit Card String Program
Code :
private int calcCheckDigits() {
int sum;
sum = checkSum();
System.out.println("Sum2 = " + sum);
// if ((sum + checkDigit) % 10 == 0) {
checkDigit += sum;
System.out.println("checkDigit = " + checkDigit);
return checkDigit;
}
I changed my checkDigit method to return checkDigit. The problem was with the line
if ((sum + checkDigit) % 10 == 0) {
checkDigit = sum + (sum % 10);
}
because that if statement wasn't true. I changed it to the one above, but now I have checkDigit being that same incorrect number as sum, (except one less since I originally set checkDigit to -1)
And now my output is:
3213 2165 4654 6541 93
which is still obviously incorrect...
Re: Credit Card String Program
Quote:
which is still obviously incorrect...
What should the output be?
Are the formulas you are using to compute the checkdigit correct?
Do you get the correct result doing the math manually?
If not then ,maybe you need to get the correct formula and use that in the code.