问题描述:
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"
方法一:自己写的,没有层次感,看起来不够清晰
static String[][] enStr = { {"","One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Eleven","Twelve","Thirteen","Fourteen", "Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"}, //1-19 {"","","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"} // 20-90 }; public String numberToWords(int num) { if(num < 0) //非负整数 return null; String english = ""; int remain = 0; if(num / 20 == 0) {//1-19 if(num == 0) //num == 0单独处理 return "Zero"; return enStr[0][num]; } else if(num / 100 == 0){ //20-99 if(num % 10 == 0) //若是20,30,40,50,...,90 return enStr[1][num / 10]; else return enStr[1][num / 10] + " " + enStr[0][num % 10]; } else if(num / 1000 == 0){//100-999 int h = num / 100; remain = num % 100; if(remain >= 20 && remain % 10 ==0){ english = enStr[0][h] + " Hundred " + enStr[1][remain / 10]; } else if(remain >= 20 && remain % 10 > 0){ english = enStr[0][h] + " Hundred " + enStr[1][remain / 10] + " " + enStr[0][remain % 10]; } else if(remain == 0){ english = enStr[0][h] + " Hundred"; } else { english = enStr[0][h] + " Hundred " + enStr[0][remain]; } return english; } else if(num / 1000000 == 0){ //1000-999999 int th = num / 1000; remain = num % 1000; if(remain == 0){ return numberToWords(th) + " Thousand"; } return numberToWords(th) + " Thousand " + numberToWords(remain); } else if(num / 1000000000 == 0) {//1000000-999999999 int mi = num / 1000000; remain = num % 1000000; if(remain == 0){ return numberToWords(mi) + " Million"; } return numberToWords(mi) + " Million " + numberToWords(remain); } else { //1000000000-9999999999 int bi = num / 1000000000; remain = num % 1000000000; if(remain == 0){ return numberToWords( bi) + " Billion"; } return numberToWords(bi) + " Billion " + numberToWords(remain); } }
方法二:代码整齐,参考别人的
public String numberToWords(int num) { if (num < 0) { return ""; } //数字为0直接返回 if (num == 0) { return "Zero"; } //左起段落 int segment1 = num / 1000000000; //段落1:十亿位-千亿位 int segment2 = num % 1000000000 / 1000000; //段落2:百万位-亿位 int segment3 = num % 1000000 / 1000; //段落3:千位-十万位 int segment4 = num % 1000; //段落4:个位-百位 String result = ""; if (segment1 > 0) { result += numToWordsLessThan1000(segment1) + " " + "Billion"; } if (segment2 > 0) { result += numToWordsLessThan1000(segment2) + " " + "Million"; } if (segment3 > 0) { result += numToWordsLessThan1000(segment3) + " " + "Thousand"; } if (segment4 > 0) { result += numToWordsLessThan1000(segment4); } return result.trim(); //去掉字符串首尾的空格 } private String numToWordsLessThan1000(int num) { if (num == 0 || num >= 1000) { return ""; } String result = ""; if (num >= 100) { result += numToWordsBase(num / 100) + " " + "Hundred"; } num = num % 100; if (num > 20) { result += numToWordsBase(num / 10 * 10); if (num % 10 != 0) { result += numToWordsBase(num % 10); } } else if (num > 0) { result += numToWordsBase(num); } return result; } private String numToWordsBase(int num) { String result = " "; switch (num) { case 1: result += "One"; break; case 2: result += "Two"; break; case 3: result += "Three"; break; case 4: result += "Four"; break; case 5: result += "Five"; break; case 6: result += "Six"; break; case 7: result += "Seven"; break; case 8: result += "Eight"; break; case 9: result += "Nine"; break; case 10: result += "Ten"; break; case 11: result += "Eleven"; break; case 12: result += "Twelve"; break; case 13: result += "Thirteen"; break; case 14: result += "Fourteen"; break; case 15: result += "Fifteen"; break; case 16: result += "Sixteen"; break; case 17: result += "Seventeen"; break; case 18: result += "Eighteen"; break; case 19: result += "Nineteen"; break; case 20: result += "Twenty"; break; case 30: result += "Thirty"; break; case 40: result += "Forty"; break; case 50: result += "Fifty"; break; case 60: result += "Sixty"; break; case 70: result += "Seventy"; break; case 80: result += "Eighty"; break; case 90: result += "Ninety"; break; } return result; }