package com.interview.misc;
/**
* Convert a number into words
*
* Reference
* https://leetcode.com/problems/integer-to-english-words/
*/
public class NumberToWord {
private static int BILLION = 1000000000;
private static int MILLION = 1000000;
private static int THOUSAND = 1000;
public String numberToWords(int number){
StringBuffer buffer = new StringBuffer();
if(number ==0){
return toString(number).trim();
}
if(number < 0){
buffer.append("Minus");
number = number *-1;
}
if (number >= BILLION) {
int first = number / BILLION;
number = number % BILLION;
buffer.append(hundredsPart(first)).append(toString(BILLION));
}
if(number >= MILLION){
int first = number /MILLION;
number = number % MILLION;
buffer.append(hundredsPart(first)).append(toString(MILLION));
}
if(number >= THOUSAND){
int first = number /THOUSAND;
number = number % THOUSAND;
buffer.append(hundredsPart(first)).append(toString(THOUSAND));
}
buffer.append(hundredsPart(number));
return buffer.toString().trim();
}
private String hundredsPart(int number){
StringBuffer buffer = new StringBuffer();
if(number != 0){
if(number <= 99){
buffer.append(tenthPart(number));
}else{
int first = (number /100);
int second = number % 100;
buffer.append(toString(first) + toString(100));
if (second != 0){
buffer.append(tenthPart(second));
}
}
return buffer.toString();
}else{
return "";
}
}
private String tenthPart(int number){
StringBuffer buffer = new StringBuffer();
if(number != 0){
if(number <= 19){
buffer.append(toString(number));
}else{
int first = (number/10)*10;
int second = number%10;
buffer.append(toString(first));
if (second != 0){
buffer.append(toString(second));
}
}
return buffer.toString();
}else{
return "";
}
}
private String toString(int number){
switch(number){
case 0:
return " Zero";
case 1:
return " One";
case 2:
return " Two";
case 3:
return " Three";
case 4:
return " Four";
case 5:
return " Five";
case 6:
return " Six";
case 7:
return " Seven";
case 8:
return " Eight";
case 9:
return " Nine";
case 10:
return " Ten";
case 11:
return " Eleven";
case 12:
return " Twelve";
case 13:
return " Thrirteen";
case 14:
return " Fourteen";
case 15:
return " Fifteen";
case 16:
return " Sixteen";
case 17:
return " Seventeen";
case 18:
return " Eighteen";
case 19:
return " Nineteen";
case 20:
return " Twenty";
case 30:
return " Thirty";
case 40:
return " Forty";
case 50:
return " Fifty";
case 60:
return " Sixty";
case 70:
return " Seventy";
case 80:
return " Eighty";
case 90:
return " Ninety";
case 100:
return " Hundred";
case 1000:
return " Thousand";
case 1000000:
return " Million";
case 1000000000:
return " Billion";
default:
throw new IllegalArgumentException();
}
}
public static void main(String args[]){
NumberToWord ntw = new NumberToWord();
System.out.println(ntw.numberToWords(8000));
System.out.println(ntw.numberToWords(8192));
System.out.println(ntw.numberToWords(8112));
System.out.println(ntw.numberToWords(504));
System.out.println(ntw.numberToWords(565100));
System.out.println(ntw.numberToWords(6721157));
System.out.println(ntw.numberToWords(-106721157));
System.out.println(ntw.numberToWords(106070571));
System.out.println(ntw.numberToWords(-92));
System.out.println(ntw.numberToWords(0));
System.out.println(ntw.numberToWords(1212121451));
}
}