有一道面试题是这样的:输入一串数字,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();
}
输出: