/** This class contains the static methods used to
 anglicize integers in the range 1..999,999.
 Method anglicize contains the first, functional, solution
 Method anglicize1 contains the second solution */
public class Ang {
    
    /** = English equivalent of n, for 0 < n < 1000000
     e.g. anglicize(1) is "one"
     anglicize(103) is "one hundred three"
     anglicize(5040) is "five thousand forty"
     anglicize(50239) is
     "fifty thousand two hundred thirty nine" */
    public static String anglicize(int n) {
        if (n >= 1000) {
            return ang1000(n / 1000) + " thousand " 
                +  ang1000(n % 1000) ; 
        } else {
            return "" + ang1000(n);
        }
    }
    
    /** = anglicization of n, for 0 <= n < 1000 
          ang1000(0) = ""*/
    public static String ang1000(int n) {
                if (n >= 100) {
            return ang100(n / 100) + " hundred " 
                +  ang1000(n % 100) ; 
        } else {
            return "" + ang100(n);
        }

    }
    
    /** = anglicization of n, for 0 <= n < 100 
          ang100(0) = ""*/
    public static String ang100(int n) {
        if (n >= 20) {
            return tensName(n / 10) + digitName(n % 10);
        }
        else if (n >= 10)
            return teenName(n);
            else   return tensName(n);
    }

    
    
    
    

    
    
    
    /** = name of n, for 0 <= n < 10
     = "", if n = 0  */
    public static String digitName(int n) {
        if (n == 0) return "";
        if (n == 1) return "one ";
        if (n == 2) return "two ";
        if (n == 3) return "three ";
        if (n == 4) return "four ";
        if (n == 5) return "five ";
        if (n == 6) return "six ";
        if (n == 7) return "seven ";
        if (n == 8) return "eight ";
        return "nine ";
    }
    
    /** = name of n, for 10 <= n <= 19 */
    public static String teenName(int n) {
        if (n == 10) return "ten ";
        if (n == 11) return "eleven ";
        if (n == 12) return "twelve ";
        if (n == 13) return "thirteen ";
        if (n == 14) return "fourteen ";
        if (n == 15) return "fifteen ";
        if (n == 16) return "sixteen ";
        if (n == 17) return "seventeen ";
        if (n == 18) return "eighteen ";
        return "nineteen ";
    }
    
    /** = name of 10*n, for 2 <= n <= 9 */
    public static String tensName(int n) {
        if (n == 2) return "twenty ";
        if (n == 3) return "thirty ";
        if (n == 4) return "forty ";
        if (n == 5) return "fifty ";
        if (n == 6) return "sixty ";
        if (n == 7) return "seventy ";
        if (n == 8) return "eighty ";
        return "ninety ";
    }
    
    /** = English equivalent of n, for 0 < n < 1,000,000 */
    public static String anglicize1(int n) {
        String s= "";  // anglicize(n) = s + anglicize(k)
        int k= n;
        
        if (k >= 1000) {
            s= s + anglicize1(k/1000) + "thousand ";
            k= k % 1000;
        }
        if (k >= 100) {
            s= s + digitName(k/100) + "hundred ";
            k= k % 100;
        }
        if (k >= 20) {
            s= s + tensName(k/10);
            k= k % 10;
        }
        if (k >= 10) {
            s= s + teenName(k);
            k= 0;
        }
        if (k > 0) {
            s= s + digitName(k);
            k= 0;
        }
        return s;
    }
}
