Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 验证字符串(PPS编号)_Java_String_Loops - Fatal编程技术网

Java 验证字符串(PPS编号)

Java 验证字符串(PPS编号),java,string,loops,Java,String,Loops,好的,我正在尝试验证一个字符串(在本例中是PPS编号)。我似乎无法使它正常工作 问题是: 每个爱尔兰公民在达到法定年龄后都会被分配一个PPS号码 这是他们独有的,用于征税目的。有效的 PPS编号总共有8或9个字符。它将开始 正好有7个数字,以一个或两个大写字母结尾。所以 例如,1234567A将被视为一个有效的PPS编号,就像 7863456RT,但6478TY*%&和8768086b都将被视为无效 PPS号码 包评估2013two; 导入java.util.Scanner; 公共类group3

好的,我正在尝试验证一个字符串(在本例中是PPS编号)。我似乎无法使它正常工作

问题是:

每个爱尔兰公民在达到法定年龄后都会被分配一个PPS号码 这是他们独有的,用于征税目的。有效的 PPS编号总共有8或9个字符。它将开始 正好有7个数字,以一个或两个大写字母结尾。所以 例如,1234567A将被视为一个有效的PPS编号,就像 7863456RT,但6478TY*%&和8768086b都将被视为无效 PPS号码

包评估2013two;
导入java.util.Scanner;
公共类group3解决方案{
公共静态void main(字符串[]args)
{
int指数=0;
char ch;
扫描仪输入=新扫描仪(System.in);
System.out.print(“请输入您的PPS号码:”);
字符串ppsNumber=input.nextLine();

如果(ppsNumber.length()>=8&&ppsNumber.length()='A'&&ppsNumber.charAt(7)='A'&&ppsNumber.charAt(8)='0'&&ch='0'&&ch我更喜欢使用正则表达式来处理这些类型的问题

if(ppsNumber.matches("\\d{7}[A-Z]{1,2}"))
{ 
  // valid
}
else
{
  //invalid
}

对于这类问题,我更喜欢正则表达式

if(ppsNumber.matches("\\d{7}[A-Z]{1,2}"))
{ 
  // valid
}
else
{
  //invalid
}

它与您的
索引
变量有关。您有以下循环:

index = 6;
ch = ppsNumber.charAt(index);
while(index < ppsNumber.length() && ch >= '0' && ch <= '9'){
  index--;
  if(index < ppsNumber.length())
  ch = ppsNumber.charAt(index);
 }
这永远不会是真的。此时,您的代码已检查PPS的长度是否合适。
index
从6开始,只能变小,因此index永远不会等于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.");
index = 6;
ch = ppsNumber.charAt(index);
while(index < 0 && ch >= '0' && ch <= '9'){
    index--;
    ch = ppsNumber.charAt(index);
}
if (/*    */) {

} else
    /*        */;
for(int i=0;i'9'){
System.out.println(“您输入的PPS号码无效”);
返回;
}
}
System.out.println(“您输入的PPS号码无效”);

这样,一旦发现错误,您的循环就会存在。如果您通过了循环,那么您就通过了--无需额外检查。

这与您的
索引
变量有关。您有这个循环:

index = 6;
ch = ppsNumber.charAt(index);
while(index < ppsNumber.length() && ch >= '0' && ch <= '9'){
  index--;
  if(index < ppsNumber.length())
  ch = ppsNumber.charAt(index);
 }
这永远不会是真的。此时,您的代码已检查PPS的长度是否合适。
index
从6开始,只能变小,因此index永远不会等于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.");
index = 6;
ch = ppsNumber.charAt(index);
while(index < 0 && ch >= '0' && ch <= '9'){
    index--;
    ch = ppsNumber.charAt(index);
}
if (/*    */) {

} else
    /*        */;
for(int i=0;i'9'){
System.out.println(“您输入的PPS号码无效”);
返回;
}
}
System.out.println(“您输入的PPS号码无效”);
这样,您的循环一发现错误就存在。如果您通过了循环,那么您就通过了--无需额外检查。

尝试以下方法:

  if(ppsNumber.charAt(7) >= 'A' && ppsNumber.charAt(7) <= 'Z' && (ppsNumber.legth() =8 || (ppsNumber.charAt(8) >= 'A' && ppsNumber.charAt(8) <= 'Z')))
if(ppsNumber.charAt(7)>='A'&&ppsNumber.charAt(7)='A'&&ppsNumber.charAt(8)尝试以下操作:

  if(ppsNumber.charAt(7) >= 'A' && ppsNumber.charAt(7) <= 'Z' && (ppsNumber.legth() =8 || (ppsNumber.charAt(8) >= 'A' && ppsNumber.charAt(8) <= 'Z')))

if(ppsNumber.charAt(7)>='A'&&ppsNumber.charAt(7)='A'&&ppsNumber.charAt(8)存在多个问题。我发现的第一个问题是:

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.");
如果条目长度为8位,且最后一位不是大写字母(“8768086b”),则此行也会出现越界:

但是这看起来很复杂。看看下面,如果条件相反,这更简单。然后你可以把它分成两个检查(实际上是这样的)

在这些更改之后,它会针对您指定的输入正确运行

作为一个一般的风格说明,您应该尝试编写代码,以避免出现太多缩进。您正在做很多这方面的工作:

if (/* some check */) {
    /* indent and do a whole lot of stuff */

} else {
    /* it's not valid */
}
如果if块中的代码很长,那么很难判断else块所指的是什么。通常情况下,以下内容比较简单:

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 (/*    */)
{
    while (/*    */) {

    }
}
挑一个或另一个


如果你将来问问题,你也应该描述你遇到的具体问题,而不仅仅是“不能正常工作”,“不能工作”没有告诉我们如何帮助,有些人相当不愿意或无法运行该程序。特别是在涉及异常之类的情况下。发布堆栈跟踪并指出引发错误的行。至少应该清楚地说明存在异常以及异常的类型。

存在多个异常我发现的第一个问题是:

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.");
如果条目长度为8位,且最后一位不是大写字母(“8768086b”),则此行也会出现越界:

但是这看起来很复杂。看看下面,如果条件相反,这更简单。然后你可以把它分成两个检查(实际上是这样的)

在这些更改之后,它会针对您指定的输入正确运行

作为一个一般的风格说明,您应该尝试编写代码,以避免出现太多缩进。您正在做很多这方面的工作:

if (/* some check */) {
    /* indent and do a whole lot of stuff */

} else {
    /* it's not valid */
}
如果if块中的代码很长,那么很难判断else块所指的是什么。通常情况下,以下内容比较简单:

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 (/*    */)
{
    while (/*    */) {

    }
}
挑一个或另一个

如果你将来问问题,你也应该描述你遇到的具体问题,而不仅仅是“不正常工作”,“不正常工作”没有告诉我们如何帮助,有些人相当不愿意或不愿意