【实践】输入阿拉伯数字,输出英文写法。

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

输出:

2010081914351382.gif

转载于:https://www.cnblogs.com/nett/archive/2010/08/19/1803496.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值