3

基本上,我的情况需要我检查用户从键盘输入定义的字符串在一种情况下是否仅为字母字符,在另一种情况下仅为数字。这是用 Java 编写的。

我当前的代码:

switch (studentMenu) {
                case 1: // Change all four fields
                    System.out.println("Please enter in a first name: ");

                    String firstNameIntermediate = scan.next();
                    firstName = firstNameIntermediate.substring(0,1).toUpperCase() + firstNameIntermediate.substring(1);
                    System.out.println("Please enter in a middle name");
                    middleName = scan.next();
                    System.out.println("Please enter in a last name");
                    lastName = scan.next();
                    System.out.println("Please enter in an eight digit student ID number");
                    changeID();
                    break;
                case 2: // Change first name
                    System.out.println("Please enter in a first name: ");
                    firstName = scan.next();
                    break;
                case 3: // Change middle name
                    System.out.println("Please enter in a middle name");
                    middleName = scan.next();
                    break;
                case 4: // Change last name
                    System.out.println("Please enter in a last name");
                    lastName = scan.next();
                case 5: // Change student ID:
                    changeID();
                    break;
                case 6: // Exit to main menu
                    menuExit = true;
                default:
                    System.out.println("Please enter a number from 1 to 6");
                    break;
            }
        }
    }

public void changeID() {
    studentID = scan.next();
    }

我需要确保 StudentID 只是数字,并且每个名称段都是按字母顺序排列的。

4

6 回答 6

6

java.util.Scanner已经可以使用方法检查下一个标记是否属于给定的模式/类型hasNextXXX

这是一个boolean hasNext(String pattern)使用正则表达式验证下一个标记是否仅包含字母的示例[A-Za-z]+

    Scanner sc = new Scanner(System.in);
    System.out.println("Please enter letters:");
    while (!sc.hasNext("[A-Za-z]+")) {
        System.out.println("Nope, that's not it!");
        sc.next();
    }
    String word = sc.next();
    System.out.println("Thank you! Got " + word);

这是一个示例会话:

Please enter letters:
&#@#$
Nope, that's not it!
123
Nope, that's not it!
james bond
Thank you! Got james

要验证下一个标记是一个可以转换为的数字,请int使用hasNextInt(),然后nextInt()

相关问题

于 2010-06-22T06:51:29.843 回答
4

使用正则表达式可能最容易做到这一点。这是一些示例代码:

import java.util.regex.*;

public class Test
{
    public static void main(String[] args) throws Exception
    {
        System.out.println(isNumeric("123"));
        System.out.println(isNumeric("abc"));
        System.out.println(isNumeric("abc123"));

        System.out.println(isAlpha("123"));
        System.out.println(isAlpha("abc"));
        System.out.println(isAlpha("abc123"));
    }

    private static final Pattern NUMBERS = Pattern.compile("\\d+");
    private static final Pattern LETTERS = Pattern.compile("\\p{Alpha}+");

    public static final boolean isNumeric(String text)
    {
        return NUMBERS.matcher(text).matches();
    }

    public static final boolean isAlpha(String text)
    {
        return LETTERS.matcher(text).matches();
    }
}

您可能应该编写“getAlphaInput”和“getNumericInput”方法,它们执行适当的提示/获取/检查循环,直到输入正确。或者可能只是getInput(Pattern)为了避免为不同的模式编写类似的代码。

您还应该制定关于什么是“字母”的要求 - 以上仅适用于 az 和 AZ ......如果您还需要处理口音等,您应该更仔细地查看Pattern文档并进行适当调整。

请注意,您也可以使用正则表达式来验证字符串长度等内容。他们非常灵活。

于 2010-06-22T06:41:12.730 回答
0

我不确定这是最好的方法,但是您可以像这样使用 Character.isDigit() 和 Character.IsLiteral() :

for( char c : myString.toCharArray() ) {
    if( !Character.isLiteral(c) ) {
        // 
    }
}
于 2010-06-22T06:38:22.657 回答
0

我认为您不能阻止用户输入无效值,但您可以选择验证您收到的数据。我是正则表达式的粉丝。真的很快,可能是这样的(所有值都初始化为空字符串):

while (!firstName.matches("^[a-zA-Z]+$")) {
    System.out.println("Please enter in a first name");
    firstName = scan.next();
}

...

while (!studentID.matches("^\\d{8}$")) {
    System.out.println("Please enter in an eight digit student ID number");
    changeID();
}

如果你走这条路,你不妨对需要验证的不同案例进行分类,并创建一些帮助方法来处理每个案例。

“正则表达式”一开始看起来似乎势不可挡,但学习它具有很大的价值,并且不乏有关它的教程。

于 2010-06-22T06:38:32.710 回答
0

尝试正则表达式: \d+ -- 数字,[A-Za-z]+ -- 字母

于 2010-06-22T06:38:39.810 回答
0

那是代码

    public class InputLetters {
    String  InputWords;
    Scanner reader;
    boolean [] TF;
    boolean FT;     

    public InputLetters() {

        FT=false;

        while(!FT){     
            System.out.println("Enter that you want to: ");
            reader = new Scanner(System.in);
            InputWords = reader.nextLine();
            Control(InputWords);            
        }

    }


public void Control(String s){
String [] b = s.split(" ");
TF = new boolean[b.length];
    for(int i =0;i<b.length;i++){
        if(b[i].matches("^[a-zA-Z]+$")){
            TF[i]=true;
        }else
        {
            TF[i]=false;
        }               
    }
    for(int j=0;j<TF.length;j++){
        if(!TF[j]){
            FT=false;
            System.out.println("Enter only English Characters!");
            break;
        }else{
            FT=true;
        }

    }
}
于 2017-03-18T17:07:03.510 回答