I wrote this function many years ago for a check-printing program. It originally was in 360 Assembly Language, but here it is in Java:
/**
* Convert a long integer to words.
*
* @author Glen F. Marshall
* @version 3.0
*/
public class NumWord {
private final static NumWordString Units[] = {NumWordString.NULL, NumWordString.ONE, NumWordString.TWO,
NumWordString.THREE, NumWordString.FOUR, NumWordString.FIVE, NumWordString.SIX, NumWordString.SEVEN,
NumWordString.EIGHT, NumWordString.NINE, NumWordString.TEN, NumWordString.ELEVEN,
NumWordString.TWELVE, NumWordString.THIRTEEN, NumWordString.FOURTEEN, NumWordString.FIFTEEN,
NumWordString.SIXTEEN, NumWordString.SEVENTEEN, NumWordString.EIGHTEEN, NumWordString.NINETEEN};
private final static NumWordString Tens[] = {NumWordString.NULL, NumWordString.NULL,
NumWordString.TWENTY, NumWordString.THIRTY, NumWordString.FORTY, NumWordString.FIFTY,
NumWordString.SIXTY, NumWordString.SEVENTY, NumWordString.EIGHTY, NumWordString.NINETY};
/**
* Convert input number to its word-string equivalent
*
* @param n
* Input number (long integer)
* @return Word-string for number
*/
public static String toString(long n) {
StringBuilder R = new StringBuilder();
R.setLength(0);
int i;
/**
* Depending of the input value, construct an output string in R
*/
if (n < 0) {
R.append(NumWordString.MINUS.toString() + ” ” + NumWord.toString(-n));
} else if (n < 20) {
return (Units[(int) n].toString());
} else if (n < 100) {
R.append(Tens[(int) n / 10].toString()
+ ” ” + NumWord.toString(n % 10));
} else if (n < 1000) {
R.append(NumWord.toString(n / 100)
+ ” ” + NumWordString.HUNDRED.toString()
+ ” ” + NumWord.toString(n % 100));
} else if (n < 1000000) {
R.append(NumWord.toString(n / 1000)
+ ” ” + NumWordString.THOUSAND.toString()
+ ” ” + NumWord.toString(n % 1000));
} else if (n < 1000000000) {
R.append(NumWord.toString(n / 1000000)
+ ” ” + NumWordString.MILLION.toString()
+ ” ” + NumWord.toString(n % 1000000));
} else if (n < 1000000000000L) {
R.append(NumWord.toString(n / 1000000000)
+ ” ” + NumWordString.BILLION.toString()
+ ” ” + NumWord.toString(n % 1000000000));
} else if (n < 1000000000000000L) {
R.append(NumWord.toString(n / 1000000000000L)
+ ” ” + NumWordString.TRILLION.toString()
+ ” ” + NumWord.toString(n % 1000000000000L));
} else if (n < 1000000000000000000L) {
R.append(NumWord.toString(n / 1000000000000000L)
+ ” ” + NumWordString.QUADRILLION.toString()
+ ” ” + NumWord.toString(n % 1000000000000000L));
} else {
R.append(NumWord.toString(n / 1000000000000000000L)
+ ” ” + NumWordString.QUINTILLION.toString()
+ ” ” + NumWord.toString(n % 1000000000000000000L));
}
/**
* Strip any embedded double spaces
*/
while ((i = R.indexOf(“ “)) >= 0) {
R.deleteCharAt(i);
}
/**
* Strip any trailing space
*/
if (R.charAt(i = R.length() – 1) == ‘ ‘) {
R.deleteCharAt(i);
}
return R.toString();
}
And the enumeration…
public enum NumWordString {
MINUS(“minus”),
NULL(“”),
ONE(“One”),
TWO(“Two”),
THREE(“Three”),
FOUR(“Four”),
FIVE(“Five”),
SIX(“Six”),
SEVEN(“Seven”),
EIGHT(“Eight”),
NINE(“Nine”),
TEN(“Ten”),
ELEVEN(“Eleven”),
TWELVE(“Twelve”),
THIRTEEN(“Thirteen”),
FOURTEEN(“Fourteen”),
FIFTEEN(“Fifteen”),
SIXTEEN(“Sixteen”),
SEVENTEEN(“Seventeen”),
EIGHTEEN(“Eighteen”),
NINETEEN(“Nineteen”),
TWENTY(“Twenty”),
THIRTY(“Thirty”),
FORTY(“Forty”),
FIFTY(“Fifty”),
SIXTY(“Sixty”),
SEVENTY(“Seventy”),
EIGHTY(“Eighty”),
NINETY(“Ninety”),
HUNDRED(“Hundred”),
THOUSAND(“Thousand”),
MILLION(“Million”),
BILLION(“Billion”),
TRILLION(“Trillion”),
QUADRILLION(“Quadrillion”),
QUINTILLION(“Quintillion”);
private String word;
/**
* @param algorithmName
*/
NumWordString(String word){
this.word = word;
}
/* (non-Javadoc)
* @see java.lang.Enum#toString()
*/
public String toString(){
return word;
}
}