1

I am writing a program in Java that needs to take a numeric phone number from the user, for example: 555-GET-FOOD and then print all the numbers, 555-438-3663.

I ran into some issues because my program just print one number, not all of it. Also, How do I make it that the user can enter dashes as part of their input, for example: 555-GET-FOOD.

This is what I've done so far:

import java.util.*;
public class NumberTranslator {

public static void main(String[] args) {
    // Create Scanner for user input
    Scanner input = new Scanner(System.in);

    // Ask the user to enter the phone number
    System.out.println("Please enter the Phone number in this format: (555-XXX-XXXX) ");

    // Save the phone number into a string
    String phoneNumber = input.nextLine();
    //phoneNumber = phoneNumber.substring(0, 3) + "-" + phoneNumber.substring(3,6)+"-"+phoneNumber.substring(6,10)+"-";

    phoneNumber = phoneNumber.toUpperCase();
    long phoneNumberTranslated = fullPhoneNumber(phoneNumber);

    System.out.println(phoneNumberTranslated);
}

public static long fullPhoneNumber(String phoneNumber) {

    long number = 0;
    int strLength = phoneNumber.length();

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

        char letter = phoneNumber.charAt(i);

        if(Character.isLetter(letter)) {

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

        else if(Character.isDigit(letter)) {
             Character.getNumericValue(letter);
        }
        else {
            System.out.println("Invalid character!");
        }
    }
    return number;
}
}

The Output I get is as follow:

Please enter the Phone number in this format: (555-XXX-XXXX)
555getfood
3

5 Answers5

1

I suggest that you simply create a map for these

Map<Character, String> numbers = new HashMap <Character, String> ();
numbers.put('A', "1" );
numbers.put('B', "1" );
numbers.put('C', "1" );
numbers.put('D', "2" );
numbers.put('E', "2" );
numbers.put('F', "2" );
// etc

for (char c: phoneNumber.toCharArray()) {
    String val = numbers.get (c);
    if (val == null) val = String.valueOf(c);  // if no mapping use as it is
    System.out.print (val);
}
Scary Wombat
  • 44,617
  • 6
  • 35
  • 64
  • Or just: `String val = numbers.getOrDefault(c, String.valueOf(c));` But you could also declare the map as `Map numbers` and then: `result+= numbers.getOrDefault(c, c);` – LuCio Nov 07 '18 at 07:52
1

Let's update your code to make it work:

public static longfullPhoneNumber(String phoneNumber)

change to:

public static String fullPhoneNumber(String phoneNumber)

and in this function add additional result variable:

StringBuilder result = new StringBuilder();

update your else if statement:

else if (Character.isDigit(letter)) {
    number = Character.getNumericValue(letter);
}

you made convertation from Char to int but didn't save the result.

And in the end of for loop, collect our result:

result.append(String.valueOf(number));

So, the final code looks like this:

public class NumberTranslator  {
  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    // Ask the user to enter the phone number
    System.out.println("Please enter the Phone number in this format: (555-XXX-XXXX) ");

    // Save the phone number into a string
    String phoneNumber = input.nextLine();
    // phoneNumber = phoneNumber.substring(0, 3) + "-" +
    // phoneNumber.substring(3,6)+"-"+phoneNumber.substring(6,10)+"-";

    phoneNumber = phoneNumber.toUpperCase();
    String phoneNumberTranslated = fullPhoneNumber(phoneNumber);

    System.out.println(phoneNumberTranslated);
  }

  public static String fullPhoneNumber(String phoneNumber) {

    StringBuilder result = new StringBuilder();

    long number = 0;
    int strLength = phoneNumber.length();

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

      char letter = phoneNumber.charAt(i);

      if (Character.isLetter(letter)) {

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

      else if (Character.isDigit(letter)) {
        number = Character.getNumericValue(letter);
      } else {
        System.out.println("Invalid character!");
      }
      result.append(String.valueOf(number));
    }
    return result.toString();
  }
}
BSeitkazin
  • 2,889
  • 25
  • 40
0

The issue you have is that you aren't adding to the number - you're overwriting it each time. It would probably be easier to have number be a String and append the corresponding digit to the result string during each iteration of the loop.

Also, in the "else if", you're not doing anything with the expression - you have to store that value in some variable or it doesn't get saved anywhere.

Finally, to let the user input dashes, just add another "else if" where you check if the character is '-', and if it is, you append a dash to the result string.

inavda
  • 333
  • 5
  • 15
0

First thing, you need to validate your input. You can use regex pattern to validate it. Regarding your input format: 555-XXX-XXXX, you can use this regex: 555-[a-zA-Z]{3}-[a-zA-Z]{4}

And in the function fullPhoneNumber, it should return to String instead of long.

Checking my code as follows:

public static void main(String[] args) {
    // Create Scanner for user input
    Scanner input = new Scanner(System.in);

    // Ask the user to enter the phone number
    System.out.println("Please enter the Phone number in this format: (555-XXX-XXXX) ");

    // Save the phone number into a string
    String phoneNumber = input.nextLine();
    // phoneNumber = phoneNumber.substring(0, 3) + "-" +
    // phoneNumber.substring(3,6)+"-"+phoneNumber.substring(6,10)+"-";
    if (validate(phoneNumber)) {
        phoneNumber = phoneNumber.toUpperCase();
        String phoneNumberTranslated = fullPhoneNumber(phoneNumber);
        System.out.println(phoneNumberTranslated);
    } else {
        System.out.println("Wrong phone number format.");
        return;
    }

}

private static boolean validate(String phoneNumber) {
    Pattern r = Pattern.compile("555-[a-zA-Z]{3}-[a-zA-Z]{4}");

    // Now create matcher object.
    Matcher m = r.matcher(phoneNumber);
    if (m.find()) {
        return true;
    }
    return false;
}

public static String fullPhoneNumber(String phoneNumber) {

    String result = "5555-";
    String suffix = phoneNumber.substring("555-".length());
    for (int i = 0; i < suffix.length(); i++) {

        char letter = suffix.charAt(i);

        if (Character.isLetter(letter)) {

            switch (letter) {
            case 'A':
            case 'B':
            case 'C':
                result += "2";
                break;
            case 'D':
            case 'E':
            case 'F':
                result += "3";
                break;
            case 'G':
            case 'H':
            case 'I':
                result += "4";
                break;
            case 'J':
            case 'K':
            case 'L':
                result += "5";
                break;
            case 'M':
            case 'N':
            case 'O':
                result += "6";
                break;
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
                result += "7";
                break;
            case 'T':
            case 'U':
            case 'V':
                result += "8";
                break;
            case 'W':
            case 'X':
            case 'Y':
            case 'Z':
                result += "9";
                break;
            }
        } else if (letter == '-') {
            result += "-";
        }
    }
    return result;
}
Tran Ho
  • 1,442
  • 9
  • 15
0
//try this...this will definitely work
import java.util.Scanner;
public class phonenumber 
{
  char letter2num(char ch)
{
    switch (ch)
    {
        case 'A':
        case 'B':
        case 'C':
        case 'a':
        case 'b':
        case 'c':
            return '2';
        case 'D':
        case 'E':
        case 'F':
        case 'd':
        case 'e':
        case 'f':
            return '3';
        case 'G':
        case 'H':
        case 'I':
        case 'g':
        case 'h':
        case 'i':
            return '4';
        case 'J':
        case 'K':
        case 'L':
        case 'j':
        case 'k':
        case 'l':
            return '5';
        case 'M':
        case 'N':
        case 'O':
        case 'm':
        case 'n':
        case 'o':
            return '6';
        case 'P':
        case 'Q':
        case 'R':
        case 'S':
        case 'p':
        case 'q':
        case 'r':
        case 's':
            return '7';
        case 'T':
        case 'U':
        case 'V':
        case 't':
        case 'u':
        case 'v':
            return '8';
        case 'W':
        case 'X':
        case 'Y':
        case 'Z':
        case 'w':
        case 'x':
        case 'y':
        case 'z':
            return '9';
        default:
            return ch;
    }
}
public static void main(String[] args) 
{
    Scanner joey = new Scanner(System.in);
    System.out.print("\nEnter phone number (xxx-xxx-xxxx): ");
    String goku = joey.nextLine();
    char[] gohan = goku.toCharArray();
    phonenumber number= new phonenumber();
    if(goku.length() != 10)
        System.out.print("Not phone number!! ");
    else
    {
        for(int i=0; i<10 ;i++)
            gohan[i]=number.letter2num(gohan[i]);
    }
    goku=new String(gohan);
    goku = goku.replaceFirst("(\\d{3})(\\d{3})(\\d+)", "($1) $2-$3");
    System.out.print("phone number: "+goku);
    joey.close();
}

}