blob: 117a2f59278757b497252c76b1fbeb58d2285000 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
package Q3;
import java.util.*;
public class CreditCard {
private int evenSum;
private int oddSum;
private int sum;
private String ccNumber;
private String company;
public CreditCard(String num) {
this.ccNumber = num;
this.company = this.identifyCompany(num);
this.calculateSums(num);
}
public int getEvenSum() {
return evenSum;
}
public int getOddSum() {
return oddSum;
}
public int getSum() {
return sum;
}
public String getCcNumber() {
return this.ccNumber;
}
public String getCompany() {
return this.company;
}
public boolean isValid() {
return this.validateCompany()
&& this.validateLength()
&& this.validateNumber()
&& this.validateSums()
&& this.isDivisibleBy10();
}
public boolean isDivisibleBy10() {
return ((this.evenSum + this.oddSum) % 10) == 0;
}
public boolean validateCompany() {
return this.ccNumber.startsWith("4")
|| this.ccNumber.startsWith("5")
|| this.ccNumber.startsWith("37")
|| this.ccNumber.startsWith("6");
}
public boolean validateLength() {
return this.ccNumber.length() >= 13 && this.ccNumber.length() <= 16;
}
public boolean validateNumber() {
for (int i = 0; i < this.ccNumber.length(); i++)
if (!Character.isDigit(this.ccNumber.charAt(i))) return false;
return true;
}
public boolean validateSums() {
return this.evenSum > 0 && this.oddSum > 0;
}
private String identifyCompany(String number) {
if (validateCompany())
switch (number.charAt(0)) {
case '3':
return "American Express";
case '4':
return "Visa";
case '5':
return "MasterCard";
case '6':
return "Discover";
}
return "Unknown";
}
private void calculateSums(String number) {
if (!validateNumber()) return;
String reversed = this.reverseString(number);
for (int i = 0; i < reversed.length(); i++) {
int digit = this.digitFrom(reversed, i);
if (this.isOdd(i + 1)) this.oddSum += digit;
else {
String value = String.valueOf(digit * 2);
for (int j = 0; j < value.length(); j++) this.evenSum += this.digitFrom(value, j);
}
}
}
private String reverseString(String value) {
return new StringBuilder(value).reverse().toString();
}
private boolean isEven(int number) {
return number % 2 == 0;
}
private boolean isOdd(int number) {
return !this.isEven(number);
}
private int digitFrom(String input, int index) {
return Character.getNumericValue(input.charAt(index));
}
}
|