我正在尝试获取一个字符串,并将最后一位验证为字符串的其余部分。我做了两个子串。对于第一个子字符串,您必须将每个字符的位置乘以它的位置,然后将其添加到一个计数中,然后对整个计数的结果求模11。然后,这应等于第二个子字符串。我正在使用TDD,但收到一个错误,结果应为不相等。我不确定为什么,任何帮助都很好。
这是我的错误: Error
这是我的方法:
public boolean checkEndingDigit(String s) {
String endingCharacter = s.substring(s.length()-1);
String startingCharacters = s.substring(0, s.length()-2);
int startingCharSum = 0;
boolean result = false;
for (int i = 0; i < s.length()-2; i++) {
if (Character.isDigit(startingCharacters.charAt(i))) {
startingCharSum = Character.getNumericValue(startingCharacters.charAt(i) * i);
System.out.println(startingCharSum);
}
}
int endingCharSum = Character.getNumericValue(endingCharacter.charAt(0));
int finalStartingCharSum = startingCharSum % 11;
System.out.println(finalStartingCharSum);
System.out.println(endingCharSum);
if (finalStartingCharSum == endingCharSum) {
result = true;
}
return result;
}
这是我的考试:
@Test
public void checkValidEndingDigit() {
boolean result = validator.checkEndingDigit("0471958692");
assertTrue(result);
}
任何帮助都会很棒!谢谢
答案 0 :(得分:0)
仔细检查并测试可能的问题后,我相信问题在for循环声明中就很简单
由于您正在索引startingCharacters,并且startingCharacters的大小比s小2,因此在遍历它时也应考虑到这一点。我的更改应解决此问题
public boolean checkEndingDigit(String s) {
String endingCharacter = s.substring(s.length()-1);
String startingCharacters = s.substring(0, s.length()-2);
int startingCharSum = 0;
boolean result = false;
for (int i = 0; i < s.length()-2; i++) {
if (Character.isDigit(startingCharacters.charAt(i))) {
startingCharSum = Character.getNumericValue(startingCharacters.charAt(i) * i);
}
}
int finalStartingCharSum = startingCharSum % 11;
int endingCharSum = Character.getNumericValue(endingCharacter.charAt(0));
if (finalStartingCharSum == endingCharSum) {
result = true;
}
return result;
}
答案 1 :(得分:0)
startingCharacters比s短,因此我走了很远。
for (... i < s.length() ...)
startingCharacters = s.substring(...);
startingCharacters.charAt(i)
答案 2 :(得分:0)
您做错了几件事。
首先进行以下操作:
String startingCharacters = s.substring(0, s.length()-2);
您应将-2更改为-1。这将忽略除我认为最后一个字符是您的校验位以外的所有字符。
您需要更改此
for (int i = 0; i < s.length(); i++) {
对此
for (int i = 0; i < startingCharacters.length(); i++) {
最后,您什么都不加。只是分配。并将i
移动到getNumericValue
方法之外。
startingCharSum = Character.getNumericValue(startingCharacters.charAt(i) * i);
但是,使用原始字符串,只需简单地迭代小于长度的一个并从1开始而不是0(乘以0总是得到0,那么为什么总是这样做),就可以使用原始字符串将上述内容替换为以下内容。
startingCharSum = 0;
for (int i = 1; i < s.length()-1; i++) {
startingCharSum += Character.getNumericValue(s.charAt(i)) * i;
}
运行此命令时我也会出错。
请注意,当您乘以位置时,始终在第一个位置乘以0。如果正确,那么您总是可以从1开始循环,因为第一位的乘积始终为0。