Question

Given an integer between 0 and 999,999, print an English phrase that describes the integer (eg, “One Thousand, Two Hundred Thirty Four”).

This is also on CC150v5 Q17.7.

Solution

The solution in book isn’t good, so I wrote the code myself. Read it below.

Code

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

private static String[] arr11 = { "Ten ", "Eleven ", "Twelve ",
        "Thirteen ", "Fourteen ", "Fifteen ", "Sixteen ", "Seventeen ",
        "Eighteen ", "Nineteen " };

private static String[] arr10 = { "", "Ten ", "Twenty ", "Thirty ",
        "Forty ", "Fifty ", "Sixty ", "Seventy ", "Eighty ", "Ninety " };

public static String numtostring(int num) {
    int part1 = num / 1000;
    int part2 = num % 1000;
    if (part1 == 0) {
        return numBelowTrousand(part2);
    } else {
        return numBelowTrousand(part1) + "Thousand, "
                + numBelowTrousand(part2);
    }
}

public static String numBelowTrousand(int num) {
    StringBuilder sb = new StringBuilder();
    // assume num is below 1000

    // first, convert hundred digit
    int hundred = num / 100;
    if (hundred != 0) {
        sb.append(arr1[hundred] + "Hundred ");
    }

    // second, convert the rest of digits
    num %= 100;
    if (num != 0) {
        int ten = num / 10;
        int one = num % 10;
        if (ten == 1) {
            sb.append(arr11[num - 10]);
        } else {
            if (ten != 0) {
                // ten is in the range of [2,9]
                sb.append(arr10[ten]);
            }
            if (one != 0) {
                sb.append(arr1[one]);
            }
        }
    }
    return sb.toString();
}