1

I am creating a program that reads numbers between 0-999 and then returns that number in words. I have got all other numbers working but I can't figure out how to get numbers between 111 - 119, 211 - 219, 311 - 319 and so on all the way to 911 - 919. Can you anyone help? Thanks!

I have tried changing numones = number%10; to numones = number%100; but that fails to read all other numbers and causes an array outofbounds error.

public static void main(String[] args) {
int numones;
    int numtens;
    int numhundreds;
    String [] ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
        "eleven", "twelve", "thirteen", "fourteen", "fiveteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"};
    String [] tens = {"","", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};

    System.out.print("Number: ");
    int number = In.nextInt();
    while(number !=- 1) {
        if (number >= 100 && number <= 999) {
            numhundreds = number / 100;
            numtens = number/10%10;
            numones = number%10;
            if (number == 100 || number == 200 || number == 300 || number == 400 || number == 500
            || number == 600 || number == 700 || number == 800 || number == 900){
               System.out.println("" + ones[numhundreds] + " " + "hundred");
               System.out.print("Number: ");
               number = In.nextInt();
           }else{
            System.out.println("" + ones[numhundreds] + " " + "hundred and " + tens[numtens] + " " + ones[numones]);
            System.out.print("Number: ");
            number = In.nextInt();
           }
       }
   }
}

}

When 111 is entered, the output is one hundred and one when it should be one hundred and eleven.

user2653663
  • 2,818
  • 1
  • 18
  • 22
Nik
  • 23
  • 6

3 Answers3

1

First of all, instead of this long "if" statement:

if (number == 100 || number == 200 || number == 300 || number == 400 || number == 500
        || number == 600 || number == 700 || number == 800 || number == 900)

You could just check if dividing the number by 100 has no remainder, like so:

if(number%100==0)

Because 100%100=0, 200%100=0, 300%100=0 ...

Now just like Rishaan said, you need to check if "numtens" value is 1, you can also do that inside the print statement using a conditional operator:

else{
     System.out.println("" + ones[numhundreds] + " " +
     "hundred and "+ (numtens == 1 ? ones[numones+10] : tens[numtens] + " " + ones[numones]));     
     System.out.print("Number: ");
     number = In.nextInt();
   }
ElayM
  • 66
  • 1
  • 7
0

You need to check if the number in the tens is equal to 1 and can do something like this:

if (numtens == 1)
{
    System.out.println(... + ones[numones + 10]);
} else {
    System.out.println(... + tens[numtens] + ones[numones]);
}

I would've gone with this kind of approach, as it is very easy to scale to larger numbers.

StringBuilder sb = new StringBuilder();

if (numhundreds > 0)
{
    sb.append(ones[numhundreds] + " hundred");
    if (numtens > 0 || numones > 0) sb.append(" and ");
}

if (numtens == 1)
{
    sb.append(ones[10 + numones]);
} else if (numtens > 1){
    sb.append(tens[numtens]);
    if (numones > 0) sb.append(" ");
}

if (numones != 0 && numtens != 1)
{
    sb.append(ones[numones]);
}

String result = sb.toString();

System.out.println(result);
Rishaan Gupta
  • 563
  • 4
  • 18
0

Two case were missing namely "... and [tens]" and "[tens]":

public static void main(String[] args) {
    int numones;
    int numtens;
    int numhundreds;
    int twenties;
    String [] ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
        "eleven", "twelve", "thirteen", "fourteen", "fiveteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"};
    String [] tens = {"","", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
    Scanner In = new Scanner (System.in);
    System.out.print("Number: ");
    int number = In.nextInt();
    while(number !=- 1) {
        if (number >= 100 && number <= 999) {
            numhundreds = number / 100;
            numtens = number/10%10;
            numones = number%10;
            twenties = number%100;
            System.out.println("Nbr"+number+" "+numtens);
            if (number == 100 || number == 200 || number == 300 || number == 400 || number == 500
            || number == 600 || number == 700 || number == 800 || number == 900){
               System.out.println("" + ones[numhundreds] + " " + "hundred");
               System.out.print("Number: ");
               number = In.nextInt();
           }else if(number%100<20 && numtens==1){
                System.out.println("" + ones[numhundreds] + " " + "hundred and " + ones[twenties]);
                System.out.print("Number: ");
                number = In.nextInt();
           }else{
            System.out.println("" + ones[numhundreds] + " " + "hundred and " + tens[numtens] + " " + ones[numones]);
            System.out.print("Number: ");
            number = In.nextInt();
           }
        }else{
            twenties = number%100;
            System.out.println("" +ones[twenties]);
            System.out.print("Number: ");
            number = In.nextInt();
        }

   }
}
Jaja
  • 662
  • 7
  • 15