有一道面试题是这样的:输入一串数字,12位以内,然后输出对应的英文字符串。例如:输入123,输出 One Hundred And Twenty Five。
解析:
首先,我们要知道英文表示数字的是以3位为单元的(Thousand,Million,Billion,Trillion)。于是我们可以断言,要解决这个问题,应该先把输入的数字分组,以3位数为一组。
然后,我们再看数字的英文写法,0~20在英语中写法是各不相同的,然后30,40,...,90这些写法是不同的,如果遇到例如:95这样的数字,写法为:Ninety Five,可以拆分为90+5的写法。所以我们需要定义一个 Key-Value 表把不同的提出来。
接下来是实现,建立一个 Console Application:
首先定义两个 Hashtable
static Hashtable _english = null;static Hashtable _suffix = null;static Program(){if (null == _english){_english = new Hashtable();_english.Add(0, "Zero");_english.Add(1, "One");_english.Add(2, "Two");_english.Add(3, "Three");_english.Add(4, "Four");_english.Add(5, "Five");_english.Add(6, "Six");_english.Add(7, "Seven");_english.Add(8, "Eight");_english.Add(9, "Nine");_english.Add(10, "Ten");_english.Add(11, "Eleven");_english.Add(12, "Twelve");_english.Add(13, "Thirteen");_english.Add(14, "Fourteen");_english.Add(15, "Fifteen");_english.Add(16, "Sixteen");_english.Add(17, "Seventeen");_english.Add(18, "Eighteen");_english.Add(19, "Nineteen");_english.Add(20, "Twenty");_english.Add(30, "Thirty");_english.Add(40, "Forty");_english.Add(50, "Fifty");_english.Add(60, "Sixty");_english.Add(70, "Seventy");_english.Add(80, "Eighty");_english.Add(90, "Ninety");}if (null == _suffix){_suffix = new Hashtable();_suffix.Add(0, "");_suffix.Add(1, "Thousand");_suffix.Add(2, "Million");_suffix.Add(3, "Billion");_suffix.Add(4, "Trillion");//可以继续往上添加}}
接着,我们实现按3位读取的方法
static string ConvertBy2Digit(int num){string result = string.Empty;if (num <= 20)result = (string)_english[num];else{int dTen = num / 10;int dSingle = num % 10;result = string.Format("{0} {1}", _english[dTen * 10], (dSingle == 0) ? "" : _english[dSingle]);}return result;}static string ConvertBy3Digit(int num){string result = string.Empty;if (num / 100 == 0)result = ConvertBy2Digit(num % 100);elseresult = string.Format("{0} Hundred And {1}", _english[num / 100],ConvertBy2Digit(num % 100));return result;}
最后,我们应该把输入的字符串按照3位一组进行分组
static string Convert2English(string numStr){Match m = Regex.Match(numStr, "^\\d+$");if (m.Success){numStr = numStr.TrimStart('0');if (numStr.Length % 3 != 0)numStr = numStr.PadLeft(numStr.Length + (3 - numStr.Length % 3), '0');StringBuilder result = new StringBuilder();for (int i = numStr.Length / 3, j = 0; i > 0; i--, j++){int n = Convert.ToInt32(numStr.Substring((i - 1) * 3, 3));result.Insert(0, String.Format(" {0} {1}", ConvertBy3Digit(n), _suffix[j]));}return result.ToString();}return "You should input a positive integer.";}
Ok,我们只要调用 Convert2English 这个方法就可以了
static void Main(string[] args){string input = Console.ReadLine();Console.WriteLine(Convert2English(input));Console.Read();}
输出: