java - 将电话号码中的所有字母转换为数字

标签 java

我正在尝试使用国际标准字母/数字映射将每个字母替换为数字。我的输出可以正常运行,但是如何让电话号码中的破折号自动出现在输出中?例如,如果我输入 1800Flowers,它会打印为 18003569377。如何在不使用正则表达式的情况下将其打印为 1-800-3569377?

import java.util.Scanner;

public class PhoneKeypad {

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);

    //while loop keeps the program running until the user enters quit 
    while (true) {
        System.out.println("\nEnter a phone number or quit to exit:");
        String phoneNumber = input.next();

        if (phoneNumber.equalsIgnoreCase("quit")) {              
            System.out.print("\nProgrammed by me");
            return;
        }

        //checks if the phone number entered is at least 8 digits
        if (phoneNumber.length() < 8) {
            System.out.println("Invalid Phone Number");

        } else {

            System.out.println(getNumber(phoneNumber));
        }
    }

}

//method converts all letters in the phone number to digits
public static String getNumber(String phoneNumber) {

    int keypadNum = 0;

    for (int i = 0; i < phoneNumber.length(); i++) {
        char letter = phoneNumber.charAt(i);

        if (Character.isAlphabetic(letter)) {
            letter = Character.toUpperCase(letter);

            switch (letter) {
                case 'A':
                case 'B':
                case 'C':
                    keypadNum = 2;
                    break;
                case 'D':
                case 'E':
                case 'F':
                    keypadNum = 3;
                    break;
                case 'G':
                case 'H':
                case 'I':
                    keypadNum = 4;
                    break;
                case 'J':
                case 'K':
                case 'L':
                    keypadNum = 5;
                    break;
                case 'M':
                case 'N':
                case 'O':
                    keypadNum = 6;
                    break;
                case 'P':
                case 'Q':
                case 'R':
                case 'S':
                    keypadNum = 7;
                    break;
                case 'T':
                case 'U':
                case 'V':
                    keypadNum = 8;
                    break;
                case 'W':
                case 'X':
                case 'Y':
                case 'Z':
                    keypadNum = 9;
                    break;
                default:
                    System.out.println("Invalid phone number");
            }

            phoneNumber = phoneNumber.substring(0, i) + keypadNum + phoneNumber.substring(i + 1);
        }
    }

    return phoneNumber;
}
}

预期输出: Output

最佳答案

您可以将正则表达式String.replaceAll 一起使用。删除前导一个,将前三位数字、第二位三位数字和最后一组数字分组。有点像

public static String formatNumber(String phoneNumber) {
    if (phoneNumber.startsWith("1")) {
        phoneNumber = phoneNumber.substring(1);
    }
    return phoneNumber.replaceAll("(\\d{3})(\\d{3})(\\d+)", "1-$1-$2-$3");
}

public static String formatNumber(String phoneNumber) {
    return phoneNumber.replaceAll("1(\\d{3})(\\d{3})(\\d+)", "1-$1-$2-$3");
}

然后像这样调用它

System.out.println(formatNumber(getNumber(phoneNumber)));

我用 1800flowers 运行它并得到(如预期的那样)

1-800-356-9377

没有像

这样的正则表达式
public static String formatNumber(String phoneNumber) {
    if (phoneNumber.startsWith("1")) {
        phoneNumber = phoneNumber.substring(1);
    }
    return "1-".concat(phoneNumber.substring(0, 3)) //
            .concat("-").concat(phoneNumber.substring(3, 6)) //
            .concat("-").concat(phoneNumber.substring(6));
}

在调用 formatNumber 之前,您可以删除破折号以规范化

public static String removeDashes(String phoneNumber) {
    StringBuilder sb = new StringBuilder();
    for (char ch : phoneNumber.toCharArray()) {
        if (ch != '-') {
            sb.append(ch);
        }
    }
    return sb.toString();
}

然后

System.out.println(formatNumber(removeDashes(getNumber(phoneNumber))));

关于java - 将电话号码中的所有字母转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41081829/

相关文章:

Java 小程序 : no antialiased font in browser (but in AppletViewer)

Java局部对象变量的作用域

java - 如何自定义 ServiceLoader 查找插件 jar 的位置

java - 如何使用基于 Java 的配置启用安全注释?

java - 流 mp3/asx/pls/m3u webradio android

java - 有谁知道如何使用 Wordnet 和 Lucene 3.6 来扩展查询?

java - 仅当输入值不为空时,查询生成器才创建更新语句

java - JBoss 启动时调用 EJB 中的方法

java - 在区域设置“en_US”的代码 'user.title' 下找不到消息

java - Java 中 ArrayList 的合并排序