Java验证邮政编码

时间:2016-11-01 04:02:34

标签: java validation

我正在尝试编写一个程序,用于验证格式为A1A1A1或A1A 1A1的加拿大邮政编码。我在让代码识别第二种格式的空格时遇到问题。

当我运行它并尝试第二种格式时,即使它是合法的邮政编码也会说无效两次。

有什么想法吗?

public class validatePostalCodeTest {
  public static void main(String[] args) {
    Scanner kb = new Scanner(System.in);
    System.out.println("Please enter postalcode:");
    while (kb.hasNext()){
        String posCode = kb.next();
        if (posCode.length() > 7) 
            System.out.println("\nInvalid");
        if (posCode.length() < 6) 
            System.out.println("\nInvalid");    
        if (posCode.length()== 7){
            boolean valid = true;
            for (int i = 0; i < posCode.length(); i++){
                char a = posCode.charAt(0);
                char b = posCode.charAt(2);
                char c = posCode.charAt(4);
                char d = posCode.charAt(1);
                char e = posCode.charAt(5);
                char f = posCode.charAt(6);
                char g = posCode.charAt(3);
                if(! Character.isLetter(a))
                    valid = false; 
                else if (! Character.isLetter(b))
                    valid = false;
                else if (! Character.isDigit(c))
                    valid = false;
                else if (! Character.isDigit(d))
                    valid = false;
                else if (! Character.isLetter(e))
                    valid = false;
                else if (! Character.isDigit(f))
                    valid = false;
                else if (! Character.isWhitespace(g))
                    valid = false;
                break;
            }
            if (valid) System.out.println("\nValid");
            else System.out.println("\nInvalid");
        }
        if (posCode.length()== 6){
            boolean valid = true;
            for (int i = 0; i < posCode.length(); i++){
                char a = posCode.charAt(0);
                char b = posCode.charAt(2);
                char c = posCode.charAt(4);
                char d = posCode.charAt(1);
                char e = posCode.charAt(3);
                char f = posCode.charAt(5);
                if(! Character.isLetter(a))
                    valid = false; 
                else if (! Character.isLetter(b))
                    valid = false;
                else if (! Character.isLetter(c))
                    valid = false;
                else if (! Character.isDigit(d))
                    valid = false;
                else if (! Character.isDigit(e))
                    valid = false;
                else if (! Character.isDigit(f))
                    valid = false;
                break;                    
            }
            if (valid) System.out.println("\nValid");
            else System.out.println("\nInvalid");
        }
        System.out.println("\nPlease enter a postalcode:");
    }
    System.out.println("Program ending due to end-of-file");
  }
}

5 个答案:

答案 0 :(得分:1)

您已使用kb.next()来读取空格分隔的数据, 因此,当您输入邮政编码为A1A 1A1时,它将需要2次,第一次是A1A,第二次是1A1因此,您将获得2次无效输出,因为它需要2次时间数据包含一个空格,因此您需要使用nextLine()它将帮助您解决问题,

检查以下已解决的答案

public class validatePostalCodeTest 
{
   public static void main (String[] args) throws java.lang.Exception
   {

      Scanner kb = new Scanner(System.in);
      System.out.println("Please enter postalcode:");
      String posCode = kb.nextLine();

       if (posCode.length() > 7) 
           System.out.println("\nInvalid");
       if (posCode.length() < 6) 
           System.out.println("\nInvalid");    
       if (posCode.length()== 7){
           boolean valid = true;

            char a = posCode.charAt(0);
            char b = posCode.charAt(2);
            char c = posCode.charAt(4);
            char d = posCode.charAt(1);
            char e = posCode.charAt(5);
            char f = posCode.charAt(6);
            char g = posCode.charAt(3);
            if(! Character.isLetter(a))
                valid = false; 
            else if (! Character.isLetter(b))
                valid = false;
            else if (! Character.isDigit(c))
                valid = false;
            else if (! Character.isDigit(d))
                valid = false;
            else if (! Character.isLetter(e))
                valid = false;
            else if (! Character.isDigit(f))
                valid = false;
            else if (! Character.isWhitespace(g))
                valid = false;

           if (valid) System.out.println("\nValid");
           else System.out.println("\nInvalid");
       }
       if (posCode.length()== 6){
           boolean valid = true;

            char a = posCode.charAt(0);
            char b = posCode.charAt(2);
            char c = posCode.charAt(4);
            char d = posCode.charAt(1);
            char e = posCode.charAt(3);
            char f = posCode.charAt(5);
            if(! Character.isLetter(a))
                valid = false; 
            else if (! Character.isLetter(b))
                valid = false;
            else if (! Character.isLetter(c))
                valid = false;
            else if (! Character.isDigit(d))
                valid = false;
            else if (! Character.isDigit(e))
                valid = false;
            else if (! Character.isDigit(f))
                valid = false;


           if (valid) System.out.println("\nValid");
           else System.out.println("\nInvalid");
       }
       System.out.println("Program ending due to end-of-file");
   }
}    

答案 1 :(得分:0)

让我们从简化代码开始。

你的循环最多只能执行一次,因为你的结尾有一个break,这确实引发了一个问题,为什么还要烦恼呢?

您描述了加拿大邮政编码格式,其格式为:

/[A-Z]\d[A-Z]\d[A-Z]\d/

没有空格,

/[A-Z]\d[A-Z]\s\d[A-Z]\d/

...其中[A-Z]表示大写字符类A到Z,\d表示从0到9的数字,\s表示空白字符。我知道您没有使用正则表达式,但这就是我计划表示您需要解决的数据的方式。

让我们从简化案例开始,没有空格。那是你的第二个循环。我们首先从next切换到nextLine(),以便在我们的扫描仪中使用。

String posCode = kb.nextLine();

现在,我们想简单地读取整行并检查其长度。如果它等于6,我们继续 - 你的代码已经这样做了。

if(posCode.length() == 6) {
    // validation logic
}

现在这里是棘手的部分。你还记得我上面提到的正则表达式吗?碰巧有这样的模式:

  • 偶数字符必须是从A到Z的字符。
  • 奇数字符必须是0到9之间的数字。

有了这个,我们可以构建一个循环来根据这个逻辑为我们检查一些事情。请注意Character.isLetterCharacter.isDigit上的否定。

for(int i = 0; i < posCode.length(); i++) {
    if(i % 2 == 0) { // even digits
        if(!Character.isLetter(posCode.charAt(i))) {
            // reject!
            System.out.println("Invalid!");
            break;
        }
    } else { // odd digits
        if(!Character.isDigit(posCode.charAt(i))) {
            // reject!
            System.out.println("Invalid!");
            break;
        }
    }
}

实际上,这就是你需要做的。空白字符是一种特殊情况,跳过它可以很容易地忽略它。

int spaceLocation = posCode.indexOf(" ");
if(spaceLocation != -1) {
    // carve the space out and concatenate
    posCode = posCode.substring(0, spaceLocation) + posCode.substring(spaceLocation + 1, posCode.length());
}

通过执行上述操作,您只需要一种方法,即可成功验证这两种情况。

答案 2 :(得分:0)

您可以减少大量if-else语句并减少代码行。

以下代码与您的代码具有相同的逻辑,并且您可以根据需要检查邮政编码:

public class validatePostalCodeTest {

    public static void main(String[] args) throws java.lang.Exception {

        Scanner kb = new Scanner(System.in);
        System.out.println("Please enter postalcode:");
        char charPC[] = kb.nextLine().toCharArray();
        boolean valid = false;

        if (charPC.length == 7) {
            if (Character.isLetter(charPC[0]) && Character.isLetter(charPC[2]) && Character.isLetter(charPC[5])
                    && Character.isDigit(charPC[4]) && Character.isDigit(charPC[1]) && Character.isDigit(charPC[6])
                    && Character.isWhitespace(charPC[3])) {
                valid = true;
            }
        }

        else if (charPC.length == 6) {
            if (Character.isLetter(charPC[0]) && Character.isLetter(charPC[2]) && Character.isLetter(charPC[4])
                    && Character.isDigit(charPC[1]) && Character.isDigit(charPC[3]) && Character.isDigit(charPC[5])) {
                valid = true;
            }
        }

        if (valid)
            System.out.println("\nValid");
        else 
            System.out.println("\nInvalid");

        System.out.println("Program ending due to end-of-file");
    }
}

答案 3 :(得分:-1)

我只想在这里使用正则表达式:

boolean isPostalCodeValid (String postalcode) {
    return postalcode.matches("^\\w\\d\\w\\d\\w\\d|\\w\\d\\w\\s\\d\\w\\d$"));
}

在这里演示:

ideone

答案 4 :(得分:-1)

    public class validatePostalCodeTest {
    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        System.out.println("Please enter a Postcode:");
        while (kb.hasNext()){
            String posCode = kb.next();

            if (posCode.length()== 7){
                boolean valid = true;
                    char a = posCode.charAt(0);
                    char b = posCode.charAt(2);
                    char c = posCode.charAt(4);
                    char d = posCode.charAt(1);
                    char e = posCode.charAt(5);
                    char f = posCode.charAt(6);
                    char g = posCode.charAt(3);
                    if(! Character.isLetter(a))
                        valid = false; 
                    else if (! Character.isLetter(b))
                        valid = false;
                    else if (! Character.isLetter(c))
                        valid = false;
                    else if (! Character.isDigit(d))
                        valid = false;
                    else if (! Character.isDigit(e))
                        valid = false;
                    else if (! Character.isDigit(f))
                        valid = false;
                    else if (! Character.isWhitespace(g))
                        valid = false;

                if (valid) System.out.println("\nValid");
                else System.out.println("\nInvalid");
            }
            else if (posCode.length()== 6){
                boolean valid = true;
                    char a = posCode.charAt(0);
                    char b = posCode.charAt(2);
                    char c = posCode.charAt(4);
                    char d = posCode.charAt(1);
                    char e = posCode.charAt(3);
                    char f = posCode.charAt(5);
                    if(! Character.isLetter(a))
                        valid = false; 
                    else if (! Character.isLetter(b))
                        valid = false;
                    else if (! Character.isLetter(c))
                        valid = false;
                    else if (! Character.isDigit(d))
                        valid = false;
                    else if (! Character.isDigit(e))
                        valid = false;
                    else if (! Character.isDigit(f))
                        valid = false;

                if (valid) System.out.println("\nValid");
                else System.out.println("\nInvalid");
            }
else{
System.out.println("\nInvalid Length");
}

            System.out.println("\nPlease enter a Postcode:");
        }
        System.out.println("Program ending due to end-of-file");
    }

    }

请尝试以上逻辑。我已对其进行了优化。