code: public enum IntToWords {
      ;
  
      private static final String[] small = {
              "", "one", "two", "three", "four",
              "five", "six", "seven", "eight", "nine",
              "ten", "eleven", "twelve", "thirteen", "fourteen",
              "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
      private static final String[] tens = {
              "", "", "twenty", "thirty", "forty",
              "fifty", "sixty", "seventy", "eighty", "ninety"};
      private static final String[] big = {
              "", "thousand", "million", "billion", "trillion",
              "quadrillion", "quintillion"};
  
      public static void main(String[] args) {
          System.out.println(int2Text(0));
          System.out.println(int2Text(10));
          System.out.println(int2Text(30));
          System.out.println(int2Text(47));
          System.out.println(int2Text(100));
          System.out.println(int2Text(999));
          System.out.println(int2Text(1000));
          System.out.println(int2Text(9999));
          System.out.println(int2Text(123_456));
          System.out.println(int2Text(900_000_001));
          System.out.println(int2Text(1_234_567_890));
          System.out.println(int2Text(-987_654_321));
          System.out.println(int2Text(Long.MAX_VALUE));
          System.out.println(int2Text(Long.MIN_VALUE));
      }
  
      public static String int2Text(long number) {
          StringBuilder sb = new StringBuilder();
  
          if (number == 0) {
              return "zero";
          }
  
          long num = -Math.abs(number);
  
          int unit = 1;
          while (true) {
              int rem100 = (int) -(num % 100);
              if (rem100 >= 20) {
                  if (rem100 % 10 == 0) {
                      sb.insert(0, tens[rem100 / 10] + " ");
                  } else {
                      sb.insert(0, tens[rem100 / 10] + "-" + small[rem100 % 10] + " ");
                  }
              } else if (rem100 != 0) {
                  sb.insert(0, small[rem100] + " ");
              }
  
              int hundreds = (int) -(num % 1000) / 100;
              if (hundreds != 0) {
                  sb.insert(0, small[hundreds] + " hundred ");
              }
  
              num /= 1000;
              if (num == 0) {
                  break;
              }
  
              int rem1000 = (int) -(num % 1000);
              if (rem1000 != 0) {
                  sb.insert(0, big[unit] + " ");
              }
              unit++;
          }
  
          if (number < 0) {
              sb.insert(0, "negative ");
          }
  
          return sb.toString().trim();
      }
  }
  