【问题标题】:Ignoring digits, blank spaces and read String input, using Character.isLetter & Character.isDigit使用 Character.isLetter 和 Character.isDigit 忽略数字、空格并读取字符串输入
【发布时间】:2016-10-20 00:02:22
【问题描述】:

我已经被困了很长时间了。我需要忽略输入的数字、空格和特殊字符,如 $^%##&!并使用 Character.isDigit 和 Character.isLetter 阅读其他字母 a-z。我尝试过使用这两种方法,但对我来说都没有效果。请指教..

错误:

正常输出(不含空格和数字):

即使我输入了 123$@GetLoan.. 预期的输出也应该是 438-5626.. 他们应该忽略前几个字符 '123$@' 并且只读取 GetLoan..

完整问题:编写一个程序,提示用户输入以字母表示的电话号码,并以数字形式输出对应的电话号码。如果用户输入的字母多于七个,则只处理前七个字母。在第三个数字后输出 –(连字符)。允许用户同时使用大写和小写字母以及单词之间的空格。

public class Question3 {

public static void main(String[] args) {

    String letters;
    char phoneDigit;

    Scanner kb = new Scanner(System.in);

    System.out.println("Enter letters : ");
    letters = kb.next();

    for (int i = 0; i < 7; i++) {

        phoneDigit = letters.charAt(i);

        if (Character.isLetter(phoneDigit) == true) {

            if (i == 3) {
                System.out.println("-");
            } //If 

            if (phoneDigit >= 'A' && phoneDigit <= 'C'
                    || phoneDigit >= 'a' && phoneDigit <= 'c') {

                System.out.println("2");

            } else if (phoneDigit >= 'D' && phoneDigit <= 'F'
                    || phoneDigit >= 'd' && phoneDigit <= 'f') {

                System.out.println("3");

            } else if (phoneDigit >= 'G' && phoneDigit <= 'I'
                    || phoneDigit >= 'g' && phoneDigit <= 'i') {

                System.out.println("4");

            } else if (phoneDigit >= 'J' && phoneDigit <= 'L'
                    || phoneDigit >= 'j' && phoneDigit <= 'l') {

                System.out.println("5");

            } else if (phoneDigit >= 'M' && phoneDigit <= 'O'
                    || phoneDigit >= 'm' && phoneDigit <= 'o') {

                System.out.println("6");

            } else if (phoneDigit >= 'P' && phoneDigit <= 'S'
                    || phoneDigit >= 'p' && phoneDigit <= 's') {

                System.out.println("7");

            } else if (phoneDigit >= 'T' && phoneDigit <= 'V'
                    || phoneDigit >= 't' && phoneDigit <= 'v') {

                System.out.println("8");

            } else if (phoneDigit >= 'W' && phoneDigit <= 'Z'
                    || phoneDigit >= 'W' && phoneDigit <= 'z') {

                System.out.println("9");
            } // If
        } // If
    } // For loop

} //PSVM

【问题讨论】:

  • 请不要使用截图显示错误信息,在问题描述中正常输入。
  • 还要说明它是如何不工作的,预期的输出是什么以及输入是什么。

标签: java string if-statement character letter


【解决方案1】:

下面的片段可能是问题所在:

for (int i = 0; i < 7; i++) {
    phoneDigit = letters.charAt(i);
    if (Character.isLetter(phoneDigit) == true) {

您正在获取前 7 个字符,并且只打印那些是字母的字符。因此对于输入字符串123getloan,您将遍历123getl,然后isLetter 将拒绝123,因此您的程序稍后将只处理getl

要仅迭代 7 个字母,您需要将其更改为增加 i,仅当给定字符是字母时,例如通过执行以下操作:

int i = 0;
for (char phoneDigit : letters.toCharArray()) {
    if (Character.isLetter(phoneDigit)) {
        i++;

        // other ifs here

        if (i == 3) {
            System.out.println("-");
        }
    }
    if (i >= 7) {
        break;
    }
}

编辑:修复了@Andreas 提到的问题

【讨论】:

  • 嗨 krzyk,感谢您的快速回复.. 它确实忽略了数字,但它没有从头开始读取... 123 被认为是 char0 ,1 ,2... 我需要第一个字符从 'g' 开始...
  • 答案几乎是正确的。前半部分很好,但如果你只在isLetter(phoneDigit) 为真时增加i,那么如果遇到非字母,你将永远循环。你需要for (int i = 0, count = 0; i &lt; letters.length() &amp;&amp; count &lt; 7; i++),循环内有条件增量count
  • 您好安德烈亚斯,感谢您的帮助。我试过了,输出几乎是正确的!对于连字符 (-) 我放了一个 If 语句 if (i == 3) { println(" - ") } 但他们认为 1,2,3 是 char 0,1,2.. ![@987654321 @
  • @krzyk +1,但是根据您显示的执行顺序,- 打印在第 2 位和第 3 位之间,并且必须在第 3 位和第 4 位之间。更改为i == 4 i++替换为if if替换为注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2015-09-14
  • 1970-01-01
相关资源
最近更新 更多