好的,我正在尝试验证一个字符串(在本例中是PPS号)。我似乎不能让它正常工作。
以下是一个问题:
每个爱尔兰公民在年满18岁时都会得到一个PPS号码,这是他们特有的,并用于征税目的。一个有效的PPS号码总共将有8个或9个字符。它将以7位数字开头,以一个或两个大写字母结尾。因此,例如,1234567A将被视为有效的PPS号码,7863456RT也是如此,但6478TY*%和8768086b都将被视为无效的PPS号码。
package Assess2013Two;
import java.util.Scanner;
public class Group3Solution {
public static void main(String[] args)
{
int index = 0;
char ch;
Scanner input = new Scanner(System.in);
System.out.print("Please enter your PPS number: ");
String ppsNumber = input.nextLine();
if(ppsNumber.length() >= 8 && ppsNumber.length() <= 9){
if(ppsNumber.charAt(7) >= 'A' && ppsNumber.charAt(7) <= 'Z' && ppsNumber.charAt(8) >= 'A' && ppsNumber.charAt(8) <= 'Z')
{
if(ppsNumber.length() == 8) {
ch = ppsNumber.charAt(index);
while(index < ppsNumber.length() && ch >= '0' && ch <= '9'){
index++;
if(index < ppsNumber.length())
ch = ppsNumber.charAt(index);
}
if(index == ppsNumber.length())
System.out.println("You entered a valid PPS number.");
else
System.out.println("Invalid PPS number!! At least one of the first 7 characters were not digits.");
}else {
ch = ppsNumber.charAt(index);
while(index < ppsNumber.length()-2 && ch >= '0' && ch <= '9'){
index++;
if(index<ppsNumber.length()-2)
ch = ppsNumber.charAt(index);
}
if(index == ppsNumber.length()-2)
System.out.println("You entered a valid PPS number.");
else
System.out.println("Invalid PPS number!! At least one of the first 7 characters were not digits.");
}
}else
System.out.println("Invalid PPS number!! The second-last or last, or both, were not uppercase letters");
}else
System.out.println("Invalid PPS number!! It must contain at least 8 to 9 characters.");
input.close();
}
}发布于 2013-12-04 21:51:16
有很多问题。我发现的第一件事是:
index = 6;
ch = ppsNumber.charAt(index);
while(index < ppsNumber.length() && ch >= '0' && ch <= '9'){
index--;
if(index < ppsNumber.length())
ch = ppsNumber.charAt(index);
}
if(index == ppsNumber.length()-1)
System.out.println("You entered a valid PPS number.");这是一个超出界限的字符串索引,因为您正在检查index <,但是正在减少。应该是这样的:
index = 6;
ch = ppsNumber.charAt(index);
while(index < 0 && ch >= '0' && ch <= '9'){
index--;
ch = ppsNumber.charAt(index);
}这是因为你在减少:
if(index == 0)
System.out.println("You entered a valid PPS number.");如果条目有8位长,而最后一个数字不是大写字母(“8768086b”),则在这一行上也有一个界:
if(ppsNumber.charAt(7) >= 'A' && ppsNumber.charAt(7) <= 'Z' || ppsNumber.charAt(8) >= 'A' && ppsNumber.charAt(8) <= 'Z')因为它失败了前两个检查,并继续通过||。这个逻辑对于结尾有两个字母的数字也不能正确工作,因为只有一个必须通过。这可能是我能想到的“内联”整个声明的最优雅的方式:
if( ppsNumber.charAt(7) >= 'A' && ppsNumber.charAt(7) <= 'Z' &&
( ppsNumber.length() == 8 ||
ppsNumber.charAt(8) >= 'A' && ppsNumber.charAt(8) <= 'Z' ) ) {但这看起来很复杂。如果条件相反,请参阅下面的更简单的地方。然后,您可以将它分成两个检查(实际上是这样)。
在这些更改之后,它将为您指定的输入正确运行。
作为一般的样式说明,您应该尝试编写代码,这样就不会有那么多缩进。你做了很多这样的事情
if (/* some check */) {
/* indent and do a whole lot of stuff */
} else {
/* it's not valid */
}除了导致更多的缩进,如果if块中的代码是长的,那么很难知道refers块所指的是什么。一般而言,海事组织更清洁如下:
if (/* reverse the check */) {
/* it's not valid */
return;
}
/* do a whole lot of stuff */这使您的代码保持整洁和一致。例如,请参见以下内容:
Scanner in = new Scanner(System.in);
try {
String num = in.nextLine();
if (num.length() < 8 || num.length() > 9) {
System.out.println("it was invalid");
return;
}
char check = num.charAt(7);
if (check < 'A' || check > 'Z') {
System.out.println("it was invalid");
return;
} else if (num.length() == 9) {
check = num.charAt(8);
if (check < 'A' || check > 'Z') {
System.out.println("it was invalid");
return;
}
}
for (int i = 0; i < 7; i++) {
check = num.charAt(i);
if (check < '0' || check > '9') {
System.out.println("it was invalid");
return;
}
}
System.out.println("it was valid");
} finally {
in.close();
}您也不应该混合使用大括号和非大括号的if/ not语句,如下所示:
if (/* */) {
} else
/* */;它很难读懂。选择一个或另一个,而不是两者兼而有之。
对于“下一行”和“行尾”的支撑样式也是如此:
if (/* */)
{
while (/* */) {
}
}选一个或另一个。
如果你在将来提出问题,你也应该描述你遇到的具体问题,而不是“不能正常工作”。“不起作用”没有告诉我们如何帮助,有些人是合理地不愿意或不能去运行该项目。尤其是在有例外的情况下。发布堆栈跟踪并指示抛出错误的行。显然,至少应该包括有一个例外和什么样的例外。
发布于 2013-12-04 21:12:08
对于这类问题,我更喜欢regex。
if(ppsNumber.matches("\\d{7}[A-Z]{1,2}"))
{
// valid
}
else
{
//invalid
}发布于 2013-12-04 21:31:25
这与您的index变量有关。你有这个循环:
index = 6;
ch = ppsNumber.charAt(index);
while(index < ppsNumber.length() && ch >= '0' && ch <= '9'){
index--;
if(index < ppsNumber.length())
ch = ppsNumber.charAt(index);
}这有一些问题。while循环确保索引小于PPS数的长度。由于指数只会下降,所以它将永远是较小的。您要检查的最后一个字符是索引0,所以您的循环应该在这里停止。
在循环结束后,您将得到以下代码:
if(index == ppsNumber.length()-1)
System.out.println("You entered a valid PPS number.");这是不可能的。至此,您的代码检查了PPS是否是适当的长度。index从6开始,只能变小,所以索引永远不会等于PPS长度减去1。
有几种方法可以解决这个问题。您可以简单地修复您的篱笆柱错误,并更改该if语句,以确保index一直在下降。更简单的方法是去掉if语句并按如下方式调整循环:
for(int i = 0; i <= 6; i++) {
char ch = ppsNumber.charAt(i);
if(ch < '0' || ch > '9') {
System.out.println("You entered an invalid PPS number.");
return;
}
}
System.out.println("You entered an invalid PPS number.");这样,你的循环一旦发现问题就会存在。如果你通过了循环,你就通过了--不需要额外的检查。
https://stackoverflow.com/questions/20385963
复制相似问题