/** Class for methods that anglicize integers */
public class Anglicize {
    
    /** = the English equivalent of n, for 1 <= n < 1,000,000 
     e.g.  ang(3)  is  ÒthreeÓ 
           ang(64) is  "sixty four"
           ang(2641) is Òtwo thousand six hundred forty oneÓ */
    public static String angm(int n) {
        if (n == 1000)
            return ang(n / 1000) + " thousand";
        if (n > 1000)
            return ang(n / 1000) + " thousand " + ang(n % 1000);
        return ang(n);   
    }
 
   
    /** = the English equivalent of n, for 1 <= n < 1,000 
     e.g.  ang(3)  is  ÒthreeÓ 
           ang(64) is  "sixty four"
           ang(641) is Òsix hundred forty oneÓ */
    public static String ang(int n) {
        // ang(n)  is   s + ang(k)
        // to get ang(n), append ang(k) to s
        // Note: we consider ang(0) to be the empty String " "
        String s= "";
        int k= n;
        
        // Get k below 100
        if (k >= 100) {
            int digit= k / 100;
            k= k % 100;
            s= s + ang9(digit) + " hundred";
            if (k != 0)  // A blank is needed iff k is not 0
                s= s + " ";
            k= k % 100;
            
        }
        
        // { 0 <= k < 100 }
        // Get k below 20
        if (k >= 20) {
            int digit= k / 10;
            k=  k % 10;
            s=  s + angTens(digit);
            if (k != 0)  // A blank is needed iff k is not 0
                s= s + " ";
        }
        
        // { 0 <= k < 20}
        // Get k below 10
        if (k >= 10) {
            s= s + angTeens(k);
            k= 0;
        }
            
        // { 0 <= k < 10}
        // Get k below 1
            if (k > 0) {
                s= s + ang9(k);
                k= 0;
            }
        
        // k = 0
        return s;
    }
    
    /** = the English equivalent of n. Precondition: 1 <= n < 10 */
    public static String ang9(int n) {
        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";
        // { n is 9 }
        return "nine";
    }
    
    /** = the English equivalent of n*10. Precondition: n is in 2..9 */
    public static String angTens(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";
        // { n is 9 }
        return "ninety";
    }
    
    /** = the English equivalent of n. Precondition: 10 <= n < 20 */
    public static String angTeens(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";
        // { n is 19 }
        return "nineteen";
    }
    
    
}