Q: Take a number and give the equivalent number in British English words e.g.
1 = one
21 = twenty one
105 = one hundred and five
56945781 = fifty six million nine hundred and forty five thousand seven hundred and eighty one
etc.. up to 999,999,999 without using a tokenizer, or any external libraries
Working Code:
 import java.text.DecimalFormat;
  public class NumberToWord {
      private static final String[] tensWords = { "", " ten", " twenty",   
            " thirty", " forty", " fifty", " sixty", " seventy", " eighty",    
            " ninety" };
      private static final String[] words = { "", " one", " two", " three",   
            " four", " five", " six", " seven", " eight", " nine", " ten",    
            " eleven", " twelve", " thirteen", " fourteen", " fifteen",    
            " sixteen", " seventeen", " eighteen", " nineteen" };
      // Convert Number to word which is less than one thousand    
    private static String convertLessThanOneThousand(int number) {    
        String thousandWord;
          if (number % 100 < 20) {   
            thousandWord = words[number % 100];    
            number /= 100;    
        } else {    
            thousandWord = words[number % 10];    
            number /= 10;
              thousandWord = tensWords[number % 10] + thousandWord;   
            number /= 10;    
        }    
        
        if (number == 0)    
            return thousandWord;    
        
        return words[number] + " hundred" + thousandWord;    
    }
      
    //Converts any number to word between 0 to 999 999 999 999 billions millions    
    public static String convertNumberToWord(long number) throws Exception{
          if(number < 0)   
        {    
            throw new Exception("Negative numbers not supported");    
        }    
        
        if (number == 0) {    
            return "zero";    
        }
          String snumber = Long.toString(number);   
        if(snumber.length() > 13)    
        {    
            throw new Exception("Numbers greater than 999 billion are not supported");    
        }
          // pad with "0"   
        String mask = "000000000000";    
        
        // DecimalFormat converts 50 to 000000000050 based on the given mask    
        DecimalFormat df = new DecimalFormat(mask);    
        snumber = df.format(number);
          StringBuilder result = new StringBuilder();
          // XXXnnnnnnnnn   
        int billions = Integer.parseInt(snumber.substring(0, 3));    
        // nnnXXXnnnnnn    
        int millions = Integer.parseInt(snumber.substring(3, 6));    
        // nnnnnnXXXnnn    
        int hundredThousands = Integer.parseInt(snumber.substring(6, 9));    
        // nnnnnnnnnXXX    
        int thousands = Integer.parseInt(snumber.substring(9, 12));
          String wordBillions;   
        switch (billions) {    
        case 0:    
            wordBillions = "";    
            break;    
        case 1:    
            wordBillions = convertLessThanOneThousand(billions) + " billion";    
            break;    
        default:    
            wordBillions = convertLessThanOneThousand(billions) + " billion";    
        }
          result.append(wordBillions);
          String wordMillions;   
        switch (millions) {    
        case 0:    
            wordMillions = "";    
            break;    
        case 1:    
            wordMillions = convertLessThanOneThousand(millions) + " million";    
            break;    
        default:    
            wordMillions = convertLessThanOneThousand(millions) + " million";    
        }
          result.append(wordMillions);
          String wordHundredThousands;   
        switch (hundredThousands) {    
        case 0:    
            wordHundredThousands = "";    
            break;    
        case 1:    
            wordHundredThousands = "one thousand ";    
            break;    
        default:    
            wordHundredThousands = convertLessThanOneThousand(hundredThousands)+ " thousand";    
        }
          result.append(wordHundredThousands);
          result.append(convertLessThanOneThousand(thousands));
          return result.toString();   
    }
      public static void main(String[] args) {   
        
        String word = "";    
        try {    
            word = NumberToWord.convertNumberToWord(999999999999L);    
        } catch (Exception e) {    
            System.out.println("error: "+e.getMessage());    
        }    
        System.out.println(word);    
    }
  }   
  
No comments:
Post a Comment