面試隨筆---數字轉RMB中文 一文提到的问题我在上午徒手就我的思路做了代码演示,但后期参与谈论的人数超出我的预期,我觉得应该把他实现出来让更多朋友分享,我觉得值得肯定的地方是功能的扩展性以及代码的简短可读性。代码编写与调试花了我大概半个小时。写本文的目的是为了让大家更好的讨论,有兴趣的朋友可以将代码复制到本地进行测试。渐渐的,我感觉自己比较喜欢这样小的算法设计与实现了。

之所以不使用 hash 或 数组 等,是因为考虑到未来可能需要的反向转换,即通过“壹百”转换为“100”,这时,.net 框架提供的 enum.ParseFromString 便能派上用途(具体函数不是这个,当然也记不大清了),否则需要重新建立 hash、数组或枚举查找,效率、双向维护性以及可读性等方面可能会差些。

提供一个思路,在 ChineseNumberUnit 之后,应该还有 enum ChineseNumberBigUnit {个=1,万,亿,...},这样调整 enum ChineseNumberUnit{个=1,百,千},对超大数目的识别能力势必加强很多。

这是我做的测试截图:

代码很短,功能部分大概 40 行左右(收银系统个位的单位用“圆”可能更合适,我这里用了“个”):using System;

using System.Collections.Generic;
using System.Text;

namespace NumbersHelper {
    class Program {
        static void Main(string[] args) {
            while (true) {
                Console.Write(">>:");
                int i;
                if (int.TryParse(Console.ReadLine(), out i)) {
                    Console.WriteLine(NumbersHelper.ToChineseNumbers(i));
                }
                else {
                    Console.WriteLine("格式无效!");
                }
            }
        }
    }

enum ChineseNumber {
        零 = 0,
        壹,
        贰,
        叁,
        肆,
        伍,
        陆,
        柒,
        捌,
        玖
    }

enum ChineseNumberUnit {
        个 = 1,
        十,
        百,
        千,
        万,
        十万,
        百万,
        千万,
        亿,
        十亿,
        百亿,
        千亿
    }

static class NumbersHelper {

public static ChineseNumber GetChineseNumber(int i) {
            if (i < 0 || i > 9)
                throw new ArgumentOutOfRangeException("i");
            return (ChineseNumber)i;
        }

public static string ToChineseNumbers(int i) {
            Stack<string> values = new Stack<string>();
            for (int index = 1; i > 0; index++, i = i / 10) {
                ChineseNumber c = (ChineseNumber)(i % 10);
                if (c != ChineseNumber.零) {
                    values.Push(string.Format("{0}{1}", c.ToString(), ((ChineseNumberUnit)index).ToString()));
                }
                else {
                    values.Push(ChineseNumber.零.ToString());
                }
            }
            StringBuilder result = new StringBuilder();
            bool isPreZero = false;
            while (values.Count > 0) {
                string v = values.Pop();
                if ("零".Equals(v)) {
                    if (!isPreZero) {
                        result.Append(v);
                        isPreZero = true;
                    }
                }
                else {
                    result.Append(v);
                    if (isPreZero)
                        isPreZero = false;
                }
            }            
            string t = result.ToString();
            return t.EndsWith("零") ? t.Substring(0, t.Length - 1) + "整" : t;
        }

}
}

面試隨筆---數字轉RMB中文 之 我的实现(含图)相关推荐

  1. TIPTOP报表提示:foreach: 字元轉換至數字程序失敗.

    客制一个TIPTOP报表提示:foreach: 字元轉換至數字程序失敗. 把提示框的提示内容展开后内容如下: 01213, 00000, "MAX INSTANCES may not exc ...

  2. matlab源知识库,MATLAB產生隨機數

    (1)用計算機產生的是"偽隨機數".用投色子計數的方法產生真正的隨機數 , 但電腦若也這樣做 , 將會占用大量內存 ; 用噪聲發生器或放射性物質也可產生真正的隨機數 , 但不可重復 ...

  3. java三角形关键词,Java實現-數字三角形

    給定一個數字三角形,找到從頂部到底部的最小路徑和.每一步可以移動到下面一行的相鄰數字上.注意事項如果你只用額外空間復雜度O(n)的條件下完成可以獲得加分,其中n是數字三角形的總行數.您在真實的面試中是 ...

  4. trnd matlab什么意思,MATLAB隨機數生成器

    1.rand() 生成(0,1)區間上均勻分布的隨機數 基本語法:rand([M,N,P-]) 生成排列成M*N*P*-多維向量的隨機數.如果只寫M,則生成M*M矩陣:如果參數為[M,N]可以省略方括 ...

  5. ABAP將數字輸出前面補0

    將數字輸出前面補0 Function: CONVERSION_EXIT_ALPHA_INPUT 程式碼 DATA: test(5),       value LIKE regup-wrbtr VALU ...

  6. 巴斯卡三角形 and 數字位移

    以下兩題是朋友的段考題, 朋友來問我我就幫他解了一下. Problem1 假設使用者輸入3, 電腦會印出: 123 312 231 現在使用者輸入5, 則電腦會印出這些東西: 12345 51234 ...

  7. java编程找出吸血鬼数字,找出四位數的所有吸血鬼數字(JAVA)

    /** * 找出四位數的所有吸血鬼數字 * 吸血鬼數字是指位數為偶數的數字,可以由一對數字相乘而得到,而這對數字各包含乘積的一半位數的數字,其中從最初的數字中選取的數字可以任意排序. * 以兩個0結尾 ...

  8. 孫丕恕:計算力已成為數字經濟先行指數 決定未來發展潛力

    中國網財經9月20日訊(記者暢帥帥)2018夏季達沃斯論壇9月18日至20日在天津召開."創新型社會"."智慧城市"等成為本屆夏季達沃斯論壇熱議的話題,浪潮集團 ...

  9. 计算机考研自我介绍大概多少字,考研复试中文自我介绍多少字合适

    考研复试中文自我介绍多少字合适 当来到一个陌生环境中,通常需要我们进行自我介绍,通过自我介绍可以得到他人的认识.写自我介绍可不能随随便便哦,下面是小编精心整理的考研复试中文自我介绍多少字合适,欢迎大家 ...

最新文章

  1. 2019了,互联网研发是不是都快要被淘汰了?
  2. 【重构】重构概要--六大重构模块
  3. 日期加星期存入mysql_在MySQL中添加两个星期的日期?
  4. SharePoint自动化系列——Add/Remove Record from items
  5. 6进程原语:wait()和waitpid()函数
  6. centos php7.0 mysql_CentOS 7.3 下 安装LNMP(Nginx1.10+MySQL5.7+PHP7.0.20)
  7. go nocopy 不可复制的实现
  8. SAP Fiori Elements 应用的 i18n 语法使用方式
  9. 遍历 Dictionary,你会几种方式?
  10. 计算机丢失shlwapi,请教高手提示shlwapi.dll错误应该怎么处理?
  11. java 电子签章 开源_java操作pdf制作电子签章 - CSDN博客
  12. Unity脚本:寻找血量最低的敌人
  13. day6--面向对象初识
  14. 生日快乐网页模板(HTML5+CSS3+JS)
  15. 时空旅行[线段树分治][维护凸壳]
  16. SVG进阶-SMIL动画
  17. SpringBoot+Vue实现前后端分离的在线考试报名系统
  18. Open GL 基础
  19. python写论文难吗_师兄一年发表5篇CSSCI,原来高手也用套路……
  20. TRS Database admin数据字段类型总结

热门文章

  1. 福布斯:2018年将改变世界的九股科技大趋势
  2. 甲方乙方和站在外包中间的你 | 每日趣闻
  3. Facebook 重金挖不到,ASP.NET 之父,微软大神“红衣教主”传奇
  4. 科技股疯狂造富的背后,“泡沫”离我们到底有多远?
  5. 如何让Sublime Text编辑器支持新的ABAP关键字
  6. 【django】【基础】templates
  7. #define 用法
  8. Java 初始化顺序
  9. 分析apply,call方法
  10. Java并发——ReentrantLock