Created
April 28, 2010 10:02
-
-
Save Riduidel/381952 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.text.DecimalFormat; | |
// Code borrowed and tweaked from http://www.rgagnon.com/javadetails/java-0426.html | |
public class EnglishNumberToWords { | |
private static String[] tensNames = [ | |
"", | |
" ten", | |
" twenty", | |
" thirty", | |
" forty", | |
" fifty", | |
" sixty", | |
" seventy", | |
" eighty", | |
" ninety" | |
]; | |
private static String[] numNames = [ | |
"", | |
" one", | |
" two", | |
" three", | |
" four", | |
" five", | |
" six", | |
" seven", | |
" eight", | |
" nine", | |
" ten", | |
" eleven", | |
" twelve", | |
" thirteen", | |
" fourteen", | |
" fifteen", | |
" sixteen", | |
" seventeen", | |
" eighteen", | |
" nineteen" | |
]; | |
static String convertLessThanOneThousand(int number) { | |
String soFar; | |
if (number % 100 < 20){ | |
soFar = numNames[number % 100]; | |
number /= 100; | |
} | |
else { | |
soFar = numNames[number % 10]; | |
number /= 10; | |
soFar = tensNames[number % 10] + soFar; | |
number /= 10; | |
} | |
if (number == 0) return soFar; | |
return numNames[number] + " hundred" +(soFar.trim().size()==0 ? "" : " and")+ soFar; | |
} | |
static String convert(long number) { | |
// 0 to 999 999 999 999 | |
if (number == 0) { return "zero"; } | |
String snumber = Long.toString(number); | |
// pad with "0" | |
String mask = "000000000000"; | |
DecimalFormat df = new DecimalFormat(mask); | |
snumber = df.format(number); | |
// 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 tradBillions; | |
switch (billions) { | |
case 0: | |
tradBillions = ""; | |
break; | |
case 1 : | |
tradBillions = convertLessThanOneThousand(billions) + " billion "; | |
break; | |
default : | |
tradBillions = convertLessThanOneThousand(billions) + " billion "; | |
} | |
String result = tradBillions; | |
String tradMillions; | |
switch (millions) { | |
case 0: | |
tradMillions = ""; | |
break; | |
case 1 : | |
tradMillions = convertLessThanOneThousand(millions) + " million "; | |
break; | |
default : | |
tradMillions = convertLessThanOneThousand(millions) + " million "; | |
} | |
result = result + tradMillions; | |
String tradHundredThousands; | |
switch (hundredThousands) { | |
case 0: | |
tradHundredThousands = ""; | |
break; | |
case 1 : | |
tradHundredThousands = "one thousand "; | |
break; | |
default : | |
tradHundredThousands = convertLessThanOneThousand(hundredThousands) + " thousand "; | |
} | |
result = result + tradHundredThousands; | |
String tradThousand; | |
tradThousand = convertLessThanOneThousand(thousands); | |
result = result + tradThousand; | |
// remove extra spaces! | |
return result.replaceAll("^\\s+", "").replaceAll("\\b\\s{2,}\\b", " "); | |
} | |
} | |
def countLetters(numberText) { | |
return numberText.findAll("[a-z]").size() | |
} | |
def total = 0G | |
for(i in 1..1000) { | |
def text = EnglishNumberToWords.convert(i) | |
println i+" => "+text | |
total += countLetters(text) | |
} | |
println total |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment