简体   繁体   中英

Number to Word Conversion in Java

I have this homework assignment for this class I'm retaking, the problem I'm running into is that I'm over-thinking the solution. I have to create a program that converts a four digit number to words.

(Example: 1134 becomes "One One Three Four")

I have a basic code, but it's bulky and ugly. I'm also only allowed to use basic if and switch statements, we have to use a switch statement as well.

Am I over thinking this? I can't figure out how to make this code shorter and I only want to use one switch statement without a while loop. Is it even possible or is this as short as it gets.

Here's my code.

 import java.util.Scanner; public class NumberToWords { public static void main(String[] args) { //Set up scanner. Scanner kb = new Scanner(System.in); //Ask for a 4 digit integer. System.out.println("Enter a 4 digit number."); //Store 4 digit number into a variable int number = kb.nextInt(); //Seperate number into digits. int digit4 = number%10; number = number/10; int digit3 = number%10; number = number/10; int digit2 = number%10; number = number/10; int digit1 = number%10; number = number/10; //Set up a switch statement to read through the number. switch (digit1) { case 1: System.out.print("One ");break; case 2: System.out.print("Two "); break; case 3: System.out.print("Three "); break; case 4: System.out.print("Four "); break; case 5: System.out.print("Five "); break; case 6: System.out.print("Six "); break; case 7: System.out.print("Seven "); break; case 8: System.out.print("Eight "); break; case 9: System.out.print("Nine "); break; case 0: System.out.print("Zero "); break; default: System.out.print(""); break; } switch (digit2) { case 1: System.out.print("One ");break; case 2: System.out.print("Two "); break; case 3: System.out.print("Three "); break; case 4: System.out.print("Four "); break; case 5: System.out.print("Five "); break; case 6: System.out.print("Six "); break; case 7: System.out.print("Seven "); break; case 8: System.out.print("Eight "); break; case 9: System.out.print("Nine "); break; case 0: System.out.print("Zero "); break; default: System.out.print(""); break; } switch (digit3) { case 1: System.out.print("One ");break; case 2: System.out.print("Two "); break; case 3: System.out.print("Three "); break; case 4: System.out.print("Four "); break; case 5: System.out.print("Five "); break; case 6: System.out.print("Six "); break; case 7: System.out.print("Seven "); break; case 8: System.out.print("Eight "); break; case 9: System.out.print("Nine "); break; case 0: System.out.print("Zero "); break; default: System.out.print(""); break; } switch (digit4) { case 1: System.out.print("One ");break; case 2: System.out.print("Two "); break; case 3: System.out.print("Three "); break; case 4: System.out.print("Four "); break; case 5: System.out.print("Five "); break; case 6: System.out.print("Six "); break; case 7: System.out.print("Seven "); break; case 8: System.out.print("Eight "); break; case 9: System.out.print("Nine "); break; case 0: System.out.print("Zero "); break; default: System.out.print(""); break; } } } 

First, write a method to convert a single digit to a word. Something like,

private static String digitToWord(char ch) {
    switch(ch) {    
    case '0': return "Zero";
    case '1': return "One";
    case '2': return "Two";
    case '3': return "Three";
    case '4': return "Four";
    case '5': return "Five";
    case '6': return "Six";
    case '7': return "Seven";
    case '8': return "Eight";
    case '9': return "Nine";
    }
    return "Unknown (" + ch + ")";
}

Then you can get the String value of your int . And get the four characters from that String . Something like,

int number = kb.nextInt();
String str = String.format("%04d", number);
StringBuilder sb = new StringBuilder();
sb.append(digitToWord(str.charAt(0)).append(' ');
sb.append(digitToWord(str.charAt(1)).append(' ');
sb.append(digitToWord(str.charAt(2)).append(' ');
sb.append(digitToWord(str.charAt(3));
System.out.println(sb.toString());

Or,

String str = String.format("%04d", kb.nextInt());
System.out.printf("%s %s %s %s%n", digitToWord(str.charAt(0)), 
    digitToWord(str.charAt(1)), digitToWord(str.charAt(2)),
    digitToWord(str.charAt(3)));

this might help

public class NumbersInWords {

    public static void main(String[] args) {

        String number = "153";
        int numLength = number.length();
        System.out.println(numLength);
        String numberToWord = "";

        for (int j = 0; j < numLength; j++) {

            switch (number.charAt(j)) {

                case '1': {  
                    numberToWord = numberToWord + "one";
                    break;
                }
                case '2': { 
                    numberToWord = numberToWord + "two";
                    break;
                }
                case '3': {
                    numberToWord = numberToWord + "three";
                    break;
                }
                case '4': {
                    numberToWord = numberToWord + "four";
                    break;
                }
                case '5': {
                    numberToWord = numberToWord + "five";
                    break;
                }
                case '6': {
                    numberToWord = numberToWord + "six";
                    break;
                }
                case '7': {
                    numberToWord = numberToWord + "seven";
                    break;
                }
                case '8': {
                    numberToWord = numberToWord + "eight";
                    break;
                }
                case '9': {
                    numberToWord = numberToWord + "nine";
                    break;
                }
                default: {
                    numberToWord = numberToWord + "zero";
                }
            }
        }
        System.out.println(numberToWord);
    }
}

Yeah, you can simply do that operation in a for loop, executed 4 times. The division and mod is consistent at 10. Something like

For i = 0; i < 4; i++
Number/10%10
Condition to check number
Save number in array or print

Copy pasting code and names with numbers should be a red flag to use a loop (or something more is worng).

  private static final String[] DIGIT_NAMES = new String[] {"Zero ", "One ", "Two ", 
    "Three ", "Four ", "Five ", "Six ", "Seven ", "Eight ", "Nine "};

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

    int number = 0;
    do {
      // ask for a 4 digit integer
      System.out.println("Enter a 4 digit number: ");
      try {
      number = input.nextInt();
      } catch (InputMismatchException ignore) {
        System.out.println("Recieved non integer input");
        input.next(); // clear bad input
      }
    } while (number < 1000 || number > 9999);

    String result = "";
    while (number != 0) {
      result = DIGIT_NAMES[number % 10] + result;
      number = number / 10;
    }
    System.out.println(result);
    input.close();
  }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM