-1

我编程时间不长,这是我第一次在我的程序中声明一个方法并在程序中使用这个方法。简单来说,该程序让用户输入一个 5 位数的邮政编码,我创建的方法检查邮政编码是否只有 5 个字符并且都是数字。当我在程序中使用该方法时,无论我输入什么邮政编码,while 语句都会运行,要求我再次输入我的邮政编码。仅当您输入的字符串不是五个字符或只有数字的字符串时才会发生这种情况。但是,现在即使输入了实际的邮政编码,它也会发生,让我假设该方法有问题。我试图在问题中尽可能清楚,但如果需要进一步澄清,我可以尝试澄清问题,您可以提供的任何信息将不胜感激。这是我的代码:

import java.util.Scanner;

public class BarCode {
    public static void main(String[] args) {

        String zipcode;

        Scanner in = new Scanner(System.in);
        System.out.println("Please enter a 5 digit zipcode: ");
        zipcode = in.nextLine();

        while (checkInput(zipcode) == false) {
            System.out.println("You did not enter a 5 digit zipcode: ");
            zipcode = in.nextLine();
        } // end while

    } // ends main

    public static boolean checkInput(String zipcode) {
        boolean zipcodeLength = true;
        boolean zipcodeDigits = true;
        if (zipcode.length() != 5) {
            zipcodeLength = false;
        } // end if statement
        for (int i = 0; i <= zipcode.length(); i++) {
            if (!Character.isDigit(i)) {
                zipcodeDigits = false;
            } // end if statement
        } // end for statement
        if (zipcodeLength == false || zipcodeDigits == false) {
            return false;
        } // end if statement
        else {
            return true;
        } // end else statement
    } // end checkInput
}
4

7 回答 7

5

这是你的问题 :

if(!Character.isDigit(i))

应该

if(!Character.isDigit(zipcode.charAt(i)))
于 2012-10-16T18:49:35.257 回答
1
import java.util.Scanner;

public class BarCode{ public static void main(String[] args){

    String zipcode;
    Scanner in = new Scanner(System.in);
    System.out.println("Please enter a 5 digit zipcode: ");
    zipcode = in.nextLine();
    while (checkInput(zipcode)==false){
        System.out.println("You did not enter a 5 digit zipcode: ");
        zipcode = in.nextLine();
    }
}


public static boolean checkInput(String zipcode){
    boolean zipcodeLength = true;
    boolean zipcodeDigits = true;
    if (zipcode.length() != 5){
        zipcodeLength = false;
    } // end if statement
    for (int i=0; i<zipcode.length();i++){
        if(!Character.isDigit(zipcode.charAt(i))){
            zipcodeDigits = false;
        }
    }
    return zipcodeLength && zipcodeDigits;
    } // end checkInput
}
于 2012-10-16T18:51:03.963 回答
0
  while (zipcode.matches("[0-9]{5}"))==false){
    System.out.println("You did not enter a 5 digit zipcode: ");
      zipcode = in.nextLine();
  } 
于 2012-10-16T18:57:05.740 回答
0
!Character.isDigit(i)

这对我来说似乎是一个错误。i是类型int

for (int i = 0; i <= zipcode.length(); i++) {
// ...
}

所以你不是在打电话Character.isDigit(char),你在打电话Character.isDigit(int)。这两种方法的行为不同:一种处理文本字符,而另一种处理数字 unicode 值。尝试这个:

System.out.println("= char '1' =");
System.out.println(Character.isDigit('1')); // true

System.out.println("= int 1 =");
System.out.println(Character.isDigit(1)); // false

System.out.println("= Unicode 31h (49) =");
System.out.println(Character.isDigit('\u0031')); // true

System.out.println("= int 49 =");
System.out.println(Character.isDigit(49)); // true

你会得到以下输出:

= char '1' =
true
= int 1 =
false
= Unicode 31h (49) =
true
= int 49 =
true
于 2012-10-16T19:01:01.560 回答
0
 public static boolean checkInput(String zipcode){
      if (zipcode.length() != 5){
        return false;
      } 
      for ( int i=0; i<zipcode.length();i++){
char charAt = zipcode.charAt(i);
        if(!Character.isDigit(charAt)){
          return false;
        } 
      } 
     return true;
    } 

您需要使用 charAt 而不是查看是否i是数字,因为显然它会是。

于 2012-10-16T18:50:27.847 回答
0

有两个问题。

第一个是<=当你需要做的时候你会去<

第二个是您需要检查zipcode.charAt(i)而不是i. i无论您输入什么邮政编码,检查都会检查数字 0 - 4(您的代码为 5)是否有 5 位邮政编码。

所以这两行变成

for ( int i=0; i<zipcode.length();i++){
    if(!Character.isDigit(zipcode.charAt(i))){

或者,我个人会像这样编写这个方法:

public static boolean checkInput(String zipcode){
     if(zipcode.length() != 5) return false; // bad length
     for(int i = 0; i < zipcode.length(); i++) {
         if(!Character.isDigit(zipcode.charAt(i)) // bad digit
             return false;
     }
     return true; // if no bad condition, it's good
}
于 2012-10-16T18:55:48.120 回答
0

您不需要将布尔值存储false在某个布尔变量中。只需返回您发现邮政编码无效的那一刻。

你应该这样做: -

!Character.isDigit(zipcode.charAt(i))

代替:-

!Character.isDigit(i)

因此,您可以像这样修改您的方法:-

public static boolean checkInput(String zipcode){

  if (zipcode.length() != 5){
    return false;
  } 

  for ( int i = 0; i < zipcode.length(); i++){
    if(!Character.isDigit(zipcode.charAt(i))){
      return false;
    } 
  } 

  return true;
}

此外,您不需要这样做 :- booleanVar == false。只需做: -!booleanVar就够了。

于 2012-10-16T18:50:07.893 回答