Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than 231- 1.
For example,
123 - > "One Hundred Twenty Three"
12345 - > "Twelve Thousand Three Hundred Forty Five"
1234567 - > "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"
String[] ones = {"", "One ","Two ","Three ","Four ","Five ","Six ","Seven ","Eight ","Nine "};
String[] ten = {"Ten ","Eleven ","Twelve ","Thirteen ","Fourteen ","Fifteen ","Sixteen ","Seventeen ","Eighteen ","Nineteen "};
String[] tens = {"Twenty ","Thirty ","Forty ","Fifty ","Sixty ","Seventy ","Eighty ","Ninety "};
String[] hundreds = {"","Thousand ","Million ","Billion "};
public String numberToWords(int num) {
if (num < 1) {
return "Zero";
}
StringBuilder sb = new StringBuilder();
if (num / 1000000000 > 0) {
sb.append(ones[num / 1000000000]).append(hundreds[3]);
num -= num / 1000000000 * 1000000000;
}
if (num / 1000000 > 0) {
int temp = num / 1000000;
sb.append(hundred(temp)).append(hundreds[2]);
num -= temp * 1000000;
}
if (num / 1000 > 0) {
int temp = num / 1000;
sb.append(hundred(temp)).append(hundreds[1]);
num -= temp * 1000;
}
sb.append(hundred(num));
return sb.toString().trim();
}
private String hundred(int num) {
StringBuilder sb = new StringBuilder();
if (num >= 100) {
sb.append(ones[num / 100]).append(hundreds[0]);
num -= num / 100 * 100;
}
if (num / 10 > 1) {
sb.append(tens[num / 10 - 2]);
num -= num / 10 * 10;
}
if (num / 10 == 1) {
sb.append(ten[num % 10]);
} else {
sb.append(ones[num % 10]);
}
return sb.toString();
}
更好1:
private final String[] LESS_THAN_20 = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
private final String[] TENS = {"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
private final String[] THOUSANDS = {"", "Thousand", "Million", "Billion"};
public String numberToWords(int num) {
if (num == 0) return "Zero";
int i = 0;
String words = "";
while (num > 0) {
if (num % 1000 != 0)
words = helper(num % 1000) +THOUSANDS[i] + " " + words;
num /= 1000;
i++;
}
return words.trim();
}
private String helper(int num) {
if (num == 0)
return "";
else if (num < 20)
return LESS_THAN_20[num] + " ";
else if (num < 100)
return TENS[num / 10] + " " + helper(num % 10);
else
return LESS_THAN_20[num / 100] + " Hundred " + helper(num % 100);
}
更好2:
private final String[] belowTen = new String[] {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};
private final String[] belowTwenty = new String[] {"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
private final String[] belowHundred = new String[] {"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
public String numberToWords(int num) {
if (num == 0) return "Zero";
return helper(num);
}
private String helper(int num) {
String result = new String();
if (num < 10) result = belowTen[num];
else if (num < 20) result = belowTwenty[num -10];
else if (num < 100) result = belowHundred[num/10] + " " + helper(num % 10);
else if (num < 1000) result = helper(num/100) + " Hundred " + helper(num % 100);
else if (num < 1000000) result = helper(num/1000) + " Thousand " + helper(num % 1000);
else if (num < 1000000000) result = helper(num/1000000) + " Million " + helper(num % 1000000);
else result = helper(num/1000000000) + " Billion " + helper(num % 1000000000);
return result.trim();
}