【问题标题】:U.S. Phone Number Validation Question美国电话号码验证问题
【发布时间】:2011-09-21 14:32:59
【问题描述】:

我的班级的这段代码有问题:这里有问题

1.) 成功后不循环

(代码编译但是当它询问“你的电话号码是多少?”并且我输入 909-8930 时,输出只是回答:正确直到退出(带有电话号码)。我假设它假设循环?)

2.) 由于括号中的错误:

phone = phone.replaceAll("(","");

phone = phone.replaceAll(")","");

但是当我将它们注释掉并离开时效果很好: phone = phone.replaceAll("-","");

3.) 没有使用 boolean 命令进行最大字符验证。 (我们必须使用我们在课堂上学到的代码)

我正在使用 Vista(我知道,很糟糕)cmd 来编译 Java 代码。

/* 


 */
import java.util.Scanner; // 
public class PhoneNumber

{

    //********number()******
    public static boolean Number(String str)

    {
        int n=0;
        while(n<str.length()) //while condition for the loop
        {
            char c=str.charAt(n);

            if(!(c>='0'&&c<='9'))return(false);//0 to 9
            n++; // counter and checked loop?

        }   
        return (true);
    }    
    // Phone Number

    public static void main(String[] args)

    {


        // Create a Scanner object to read input.
        String phone;
        Scanner sc = new Scanner(System.in);


        // Get the favorite city
        System.out.print("What is your phone number?");  // no ln
        phone=sc.nextLine( );


        //replace all perenthesis and dashes

        phone = phone.replaceAll("-",""); 
        phone = phone.replaceAll("(","");
        phone = phone.replaceAll(")","");


        // validation of number
        if(Number(phone))
        {

            // sub stuff to add back the dash and whateves
            String first,middle,last;
            first = phone.substring (0,3);
            middle = phone.substring (3,6); 
            last = phone.substring (6);
            String phonea = "("+ first + ")" +"-"+middle+ "-"+last; 


            // print stuff back 
            System.out.println ("correct until exit"+ phonea);

            // condition to exit    
            if (phone.equalsIgnoreCase("quit")); //not working?
            if (phone.equalsIgnoreCase("end"));
            if (phone.equalsIgnoreCase("stop"))System.exit(0); 
        }
        else
        {
            System.err.println("error-incorrect format: "+ phone); //error

        }    
    }
}

【问题讨论】:

  • 你如何提供你的输入,你得到的输出是什么?
  • @Simon Chan 您明确表示这是家庭作业,我们对此表示赞赏,但请确保标记适当。我冒昧地重新标记。
  • 成功后不循环是什么意思?此外,它给括号带来了什么错误,它们对我来说看起来不错。调用你的函数Number 并没有错,但它更难理解,因为使用is 后缀返回布尔值的函数效果很好。像isNumber 这样的东西会更合适。
  • @adithya:代码可以编译,但是当它询问“你的电话号码是多少?”时我输入 909-8930 输出只是回答:正确直到退出(带有电话号码)。我假设它应该循环? @matthew:谢谢(我第一次使用这个*)! @ryan:如果您在输入正确格式后放置了一个while语句(循环)和输入,难道不是要重新提出问题吗?它不这样做。括号可能是操作系统错误(讲师在说),但我想确定,因为在我用“\”隐藏它之后它仍然无法工作
  • @Simon:您可能希望使用您在评论中提供的信息来编辑您的原始问题。关键是让您的问题尽可能容易回答。

标签: java validation loops phone-number


【解决方案1】:

终止您的应用程序的原因与您如何确定应用程序的下一个状态有关。查看正确电话号码大小写末尾的代码:

        // print stuff back 
        System.out.println ("correct until exit"+ phonea);

        // condition to exit    
        if (phone.equalsIgnoreCase("quit")); //not working?
        if (phone.equalsIgnoreCase("end"));
        if (phone.equalsIgnoreCase("stop"))
            System.exit(0);

本质上,您的意图是查看String 变量phone 是否包含用户请求的状态更改(因此,“继续”或“退出”将是我的猜测)。由于phone 只是数字的数字(或某种错误输入),因此不会为您提供状态信息。反过来,这些情况很少会是真的。

验证后您需要做的是请求用户提供正确的输入,以便应用程序可以确定下一个状态应该是什么。由于我们(SO 用户)并不确切知道程序的规范是什么,因此我们无法确定您究竟需要做什么。但是,它可能看起来像这样:

System.out.println("What would you like to do?");
String nextState = sc.nextLine();

while (!nextState.equals("quit") && !nextState.equals("exit")) {
    //Do what you need to do (read the phone number, validate it, etc)

    System.out.println("What would you like to do?");
    String nextState = sc.nextLine();
}

System.out.println("End of application");

这实质上使应用程序可以控制应用程序的启动和停止时间。虽然用户不希望应用程序停止,但您一直要求用户提供电话号码以进行验证。

虽然这不是您所遇到问题的全部答案,但希望它可以为您提供一些关于解决某些应用程序问题的体面指导。

【讨论】:

  • 感谢您的建议,但循环仍然无法正常工作。而且它不是结束语,因为它是直接复制了讲座的笔记。无论如何,谢谢!
  • 可能是讲师打错了? if(condition); 无效;它除了评估条件之外什么都不做。
【解决方案2】:

关于 1:如果您希望程序要求第二个输入,您需要告诉它这样做。主函数中的所有内容都只调用一次。您可以将所有内容放在您询问的循环中

while (!phone.equalsIgnoreCase("quit")) {

}

这将循环直到您输入退出。

到目前为止,您的退出条件不起作用,因为您在 if 语句后面留下了分号。因此,编译器认为该行结束并跳转到下一行。

 if (phone.equalsIgnoreCase("quit")); //remove the semicolon in this line, otherwise System.exit will never be called.

您还将这些行放入 if (Number(phone)) 语句中。但是由于“quit”不是数字,所以当你真正输入quit时,你永远不会到达这行代码。

【讨论】:

  • 谢谢!我试试看,你把 while (!phone.equalsIgnoreCase("quit")) { }
  • @Simon:你想重复的代码在{}之间
【解决方案3】:

一般来说,如果你不明白你的代码在做什么,我建议:

  • 尝试从您的程序中删除一些内容(在制作备份副本之后),直到您有一个简短的简单示例来说明您不理解的内容。当你可以找出一个较小的部分时,为什么还要尝试找出一个大的模糊问题呢?
  • 通过在整个代码中添加诸如 System.out.println('reached line 17') 之类的语句来进行实验,以查看您的程序执行操作的顺序。

也就是说,这里有一些(部分)答案。

1) 成功后不循环

循环重复执行其中的语句。听起来您想要重复的是程序的大部分或全部:

  1. 从键盘读取字符串
  2. 从字符串中删除某些字符
  3. 如果剩下的字符串是数字,将其分成3段,然后打印correct

如果您想一遍又一遍地重复这三个操作,您需要围绕执行这三个操作的代码进行大循环。没有循环,没有重复。

(并且该循环内的某处将是退出程序的代码如果输入字符串是“退出”等)

2) 由于括号中的错误:phone = phone.replaceAll("(","");

要解决此问题,您需要了解两件事。首先,replaceAll 将其第一个参数"(" 视为正则表达式。不用担心那是什么,只要知道replaceAll 赋予( 字符特殊的含义,而不是将其视为普通的旧(。您可以通过在( 之前放置\ 来告诉replaceAll 正常对待它。 \ 被称为“逃逸”。所以你的字符串参数的内容应该是:\(

其次,您不能只在源代码中输入"\(",因为Java 编译器本身将\ 视为特殊字符。您必须添加一个 strong> 反斜杠告诉编译器正常处理另一个反斜杠。这听起来很荒谬,但事实就是如此。

phone = phone.replaceAll("\\(","");

3) 没有使用布尔命令验证最大字符数。

不确定你想要什么:检查它有 more 还是 less 超过一定数量的字符?无论哪种方式,您都可以写一个if 来检查phone.length() 是大于还是小于某个数字。

【讨论】:

    猜你喜欢
    • 2012-05-22
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2011-03-22
    • 1970-01-01
    • 2011-05-22
    • 2010-11-11
    相关资源
    最近更新 更多