嗯,你的程序还不错,据我所知只有一个问题,那就是你只是颠倒了第一组和最后一组所需的测试。我建议您确保将 valid 初始化为 true 作为默认值。然后如果没有设置任何错误代码,它将返回true。
目前你有以下:
if (lastfourdigits != firstfourdigits - 1) {
valid = false;
errorCode = 5;
}
但你需要的是这个
if (lastfourdigits != firstfourdigits + 1) {
valid = false;
errorCode = 5;
}
您还有以下不必要的代码。
String digits = ccNumber.replaceAll("[ˆ0-9]","");
原因是您只是简单地使用ccNumber,从前四个字符的开头开始,从最后四个字符的末尾开始。通过这种方式,您不会遇到破折号,因此您不需要只获取数字。
另一个建议是,一旦发现错误,就设置错误代码并立即返回。继续处理已经发现有缺陷的卡有什么用?
其他注意事项和替代方法
这可能不是作业的一部分,但我也会考虑以下几点:
- 如果您的数字多于或少于 16 位怎么办?
- 如果您有超过三个破折号给出超过四组数字怎么办。
检查上述内容需要额外的逻辑,并且会使您的工作复杂化。但这是需要考虑的事情。下面演示了一种检查这些特定格式问题并报告它们的方法。这使用基本技术并避免流,以免重复不必要的操作。
此示例根据发现的问题引发选择性错误。正如后面解释的那样,这些可以完全改变或消除。信用卡验证是一项任务,其中最直接的解决方案是最好的,并且应该需要较低的开销。
首先,声明一个特殊的异常来捕获信用卡错误。
class BadCreditCardException extends Exception {
public BadCreditCardException(String message) {
super(message);
}
}
现在声明一些测试数据。
String[] testData = {
"1234-4566-9292-0210",
"1500-4009-2400-1600",
"1500-4009-2400-160000",
"1234-45669292-0210",
"1@34-45-66-9292-0210",
"1234-45B6-9292-0210",
"1234-4566-9292-2234",
"1234-4566-9292-021022",
"1234-4566-9292-0210",
"4567-4566-92!2-6835",
"1234-4566-9292-0210",
"1234-45+6-9292-0210",
"1234-4566-92x2-0210",
"1234-4566-9292-0210",
};
测试信用卡并报告错误。请注意,仅报告第一次遇到的错误。编号可能有多个错误。
String fmt = "%-23s - %s%n";
for(String card : testData) {
try {
validate(card);
System.out.printf(fmt,card, "Valid");
} catch (BadCreditCardException bce) {
System.out.printf(fmt,card, bce.getMessage());
}
}
以上打印。
1234-4566-9292-0210 - Invalid credit card checksum
1500-4009-2400-1600 - Valid
1500-4009-2400-160000 - Non group of 4 digits
1234-45669292-0210 - Insufficient or too may dashes
1@34-45-66-9292-0210 - Insufficient or too may dashes
1234-45B6-9292-0210 - Non digit found.
1234-4566-9292-2234 - Valid
1234-4566-9292-021022 - Non group of 4 digits
1234-4566-9292-0210 - Invalid credit card checksum
4567-4566-92!2-6835 - Non digit found.
1234-4566-9292-0210 - Invalid credit card checksum
1234-45+6-9292-0210 - Non digit found.
1234-4566-92x2-0210 - Non digit found.
1234-4566-9292-0210 - Invalid credit card checksum
解释
验证方法。该方法的工作原理如下。
- 使用破折号
(-) 作为分隔符将卡片分组。
- 如果没有四个组,则抛出异常。
- 否则,按如下方式对每个组求和,在求和过程中检查每个组。
- 首先检查该组的大小为 4,如果没有则抛出异常。
- 在迭代组字符时,如果遇到非数字,则抛出异常。
- 否则,继续计算当前组的总和,如下所示:
- 如果字符是数字,则减去
0 以将其转换为 int
并添加到当前 sums 数组元素中。
- 完成后,将该组总和添加到所有数字的
totalSum。
- 如果
totalSum 可以被4 整除,并且第一组比最后一组少一个,则它是一张有效卡。否则,抛出异常。
替代错误处理修改
如果不需要异常,而只是通过或失败指示,则进行以下更改。
- 将
void返回类型更改为boolean
- 如果抛出异常,直接返回
false
- 如果所有测试都通过,那么最后一条语句应该返回
true
public static void validate(String cardNumber) throws BadCreditCardException {
int [] groupSums = new int[4];
int totalSum = 0;
String [] groups = cardNumber.split("-");
if (groups.length != 4) {
throw new BadCreditCardException("Insufficient or too may dashes");
}
for (int i = 0; i < groupSums.length; i++) {
if (groups[i].length() != 4) {
throw new BadCreditCardException("Non group of 4 digits");
}
for(int digit : groups[i].toCharArray()) {
if (!Character.isDigit(digit)) {
throw new BadCreditCardException("Non digit found.");
}
groupSums[i]+= digit -'0';
}
totalSum += groupSums[i];
}
if (groupSums[0]+1 != groupSums[3] || totalSum % 4 != 0) {
throw new BadCreditCardException("Invalid credit card checksum");
}
}