【实践】输入阿拉伯数字,输出英文写法。
时间:2010-08-19 来源:Net!T
有一道面试题是这样的:输入一串数字,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); else result = 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(); }
输出:
相关阅读 更多 +