user3822460
user3822460

Reputation: 9

Phone numbers in java

I've got the code to put a seven letter phrase into a phone number. The hyphen is not returning in the correct spot. I really don't know how to fix this problem. It should return xxx-xxxx and if the phrase is xxxx xxx it returns xxxx-xxx. Please someone help me with this problem!

Code:

import java.util.*;
import java.lang.*;

public class Project1 {
  public static char getNumber(char letter) {
   char ret = 0;

    if (letter== 'A' || letter=='a' || letter== 'B' || letter=='b' || letter=='C' || letter=='c') {
      return '2';
    }
    else if (letter== 'D' || letter=='d' || letter== 'E' || letter=='e' || letter=='F' || letter=='f') {
      return '3';
    }
    else if (letter== 'G' || letter=='g' || letter== 'H' || letter=='h' || letter=='I' || letter=='i') {
      return '4';
    }
    else if (letter== 'J' || letter=='j' || letter== 'K' || letter=='k' || letter=='L' || letter=='l') {
      return '5';
    }
    else if (letter== 'M' || letter=='m' || letter== 'N' || letter=='n' || letter=='O' || letter=='o') {
      return '6';
    }
    else if (letter== 'P' || letter=='p' || letter== 'Q' || letter=='q' || letter=='R' || letter=='r'|| letter=='S' || letter=='s') {
      return '7';
    }
    else if (letter== 'T' || letter=='t' || letter== 'U' || letter=='u' || letter=='V' || letter=='v') {
      return '8';
    }
    else if (letter== 'W' || letter=='w' || letter== 'X' || letter=='x' || letter=='Y' || letter=='y' || letter=='Z' || letter=='z') {
      return '9';
    }
   if (letter == ' ')
     return '-';
   return ret;
  }




  public static void main (String[] arg) {
    Scanner input = new Scanner(System.in);
    System.out.println("Please enter a 7 letter phrase: ");
    String number = input.nextLine();
    for (int i = 0; i < 8; i++) {
      System.out.print(getNumber(number.toUpperCase().charAt(i)));
    }


  }
}

Upvotes: 1

Views: 1461

Answers (2)

Unihedron
Unihedron

Reputation: 11041

It should return xxx-xxxx and if the phrase is xxxx xxx it returns xxxx-xxx. Please someone help me with this problem!

Here you go! A bit of is always good for the soul:

{
    String number = input.nextLine();
    final StringBuilder builder = new StringBuilder(); // Buffer the sequence.
    for (int i = 0; i < 8; i++) {
      builder.append(getNumber(number.toUpperCase().charAt(i)));
    if (builder.toString().getCharAt(2) != '-') // If the format isn't correct, fix it
      System.out.println(builder.toString().replaceFirst("(...)(.).(...)", "$1-$2$3"))
    }
}

As seen from CSᵠ's comment, you can use the following universal regex instead, such that the section becomes:

builder.toString().replaceFirst("^\\D*(\\d)\\D*(\\d)\\D*(\\d)\\D*(\\d)\\D*(\\d)\\D*(\\d)\\D*(\\d)\\D*$", "$1$2$3-$4$5$6$7");

Edit: Updated regex as \N backreferences does not work in Java.

Upvotes: 1

jr.
jr.

Reputation: 1739

Here's a quick and dirty solution to your problem.

import java.util.*;

public class Project1 {
    public static char getNumber(char letter) {
        char ret = 0;
        if( letter < 'A' )
        {
            ret = '0';
        }
        else if( letter < 'D' )
        {
            ret = '2';
        }
        else if( letter < 'G' )
        {
            ret = '3';
        }
        else if( letter < 'J' )
        {
            ret = '4';
        }
        else if( letter < 'M' )
        {
            ret = '5';
        }
        else if( letter < 'P' )
        {
            ret = '6';
        }
        else if( letter < 'T' )
        {
            ret = '7';
        }
        else if( letter < 'W' )
        {
            ret = '8';
        }
        else if( letter <= 'Z' )
        {
            ret = '9';
        }
        else
        {
            ret = '0';

        }
        return ret;
    }

    public static void main (String[] arg) {
        Scanner input = new Scanner(System.in);
        System.out.println( "Please enter a 7 letter phrase: " );
        String number = input.nextLine().toUpperCase();
        StringBuffer buff = new StringBuffer();
        for( int i = 0, j = 0; j < number.length() && i < 7; j++ )
        {
            char c = number.charAt(j);
            if( c != ' ' )
            {
                if( i == 3 )
                {
                    buff.append( '-' );
                }
                buff.append( getNumber( c ) );
                i++;
            }
        }
        System.out.println( buff );
    }
}

Key points:

  • There is no need to check for lower case if the alpha characters are guaranteed to be uppercase.
  • There is no need to uppercase the input string on each iteration of the loop. Do it once at the beginning.
  • I'm ignoring spaces, and always adding a hyphen before I print position 3 (ie the fourth character).
  • chars can be compared just like numbers, using ranges. This simplifies the amount of code quite a bit (ie. each letter within a range doesn't need to be written down).

Upvotes: 0

Related Questions