面試隨筆---數字轉RMB中文 之 我的实现(含图)
面試隨筆---數字轉RMB中文 一文提到的问题我在上午徒手就我的思路做了代码演示,但后期参与谈论的人数超出我的预期,我觉得应该把他实现出来让更多朋友分享,我觉得值得肯定的地方是功能的扩展性以及代码的简短可读性。代码编写与调试花了我大概半个小时。写本文的目的是为了让大家更好的讨论,有兴趣的朋友可以将代码复制到本地进行测试。渐渐的,我感觉自己比较喜欢这样小的算法设计与实现了。
之所以不使用 hash 或 数组 等,是因为考虑到未来可能需要的反向转换,即通过“壹百”转换为“100”,这时,.net 框架提供的 enum.ParseFromString 便能派上用途(具体函数不是这个,当然也记不大清了),否则需要重新建立 hash、数组或枚举查找,效率、双向维护性以及可读性等方面可能会差些。
提供一个思路,在 ChineseNumberUnit 之后,应该还有 enum ChineseNumberBigUnit {个=1,万,亿,...},这样调整 enum ChineseNumberUnit{个=1,百,千},对超大数目的识别能力势必加强很多。
这是我做的测试截图:
代码很短,功能部分大概 40 行左右(收银系统个位的单位用“圆”可能更合适,我这里用了“个”):using System;
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中文 之 我的实现(含图)相关推荐
- TIPTOP报表提示:foreach: 字元轉換至數字程序失敗.
客制一个TIPTOP报表提示:foreach: 字元轉換至數字程序失敗. 把提示框的提示内容展开后内容如下: 01213, 00000, "MAX INSTANCES may not exc ...
- matlab源知识库,MATLAB產生隨機數
(1)用計算機產生的是"偽隨機數".用投色子計數的方法產生真正的隨機數 , 但電腦若也這樣做 , 將會占用大量內存 ; 用噪聲發生器或放射性物質也可產生真正的隨機數 , 但不可重復 ...
- java三角形关键词,Java實現-數字三角形
給定一個數字三角形,找到從頂部到底部的最小路徑和.每一步可以移動到下面一行的相鄰數字上.注意事項如果你只用額外空間復雜度O(n)的條件下完成可以獲得加分,其中n是數字三角形的總行數.您在真實的面試中是 ...
- trnd matlab什么意思,MATLAB隨機數生成器
1.rand() 生成(0,1)區間上均勻分布的隨機數 基本語法:rand([M,N,P-]) 生成排列成M*N*P*-多維向量的隨機數.如果只寫M,則生成M*M矩陣:如果參數為[M,N]可以省略方括 ...
- ABAP將數字輸出前面補0
將數字輸出前面補0 Function: CONVERSION_EXIT_ALPHA_INPUT 程式碼 DATA: test(5), value LIKE regup-wrbtr VALU ...
- 巴斯卡三角形 and 數字位移
以下兩題是朋友的段考題, 朋友來問我我就幫他解了一下. Problem1 假設使用者輸入3, 電腦會印出: 123 312 231 現在使用者輸入5, 則電腦會印出這些東西: 12345 51234 ...
- java编程找出吸血鬼数字,找出四位數的所有吸血鬼數字(JAVA)
/** * 找出四位數的所有吸血鬼數字 * 吸血鬼數字是指位數為偶數的數字,可以由一對數字相乘而得到,而這對數字各包含乘積的一半位數的數字,其中從最初的數字中選取的數字可以任意排序. * 以兩個0結尾 ...
- 孫丕恕:計算力已成為數字經濟先行指數 決定未來發展潛力
中國網財經9月20日訊(記者暢帥帥)2018夏季達沃斯論壇9月18日至20日在天津召開."創新型社會"."智慧城市"等成為本屆夏季達沃斯論壇熱議的話題,浪潮集團 ...
- 计算机考研自我介绍大概多少字,考研复试中文自我介绍多少字合适
考研复试中文自我介绍多少字合适 当来到一个陌生环境中,通常需要我们进行自我介绍,通过自我介绍可以得到他人的认识.写自我介绍可不能随随便便哦,下面是小编精心整理的考研复试中文自我介绍多少字合适,欢迎大家 ...
最新文章
- 2019了,互联网研发是不是都快要被淘汰了?
- 【重构】重构概要--六大重构模块
- 日期加星期存入mysql_在MySQL中添加两个星期的日期?
- SharePoint自动化系列——Add/Remove Record from items
- 6进程原语:wait()和waitpid()函数
- centos php7.0 mysql_CentOS 7.3 下 安装LNMP(Nginx1.10+MySQL5.7+PHP7.0.20)
- go nocopy 不可复制的实现
- SAP Fiori Elements 应用的 i18n 语法使用方式
- 遍历 Dictionary,你会几种方式?
- 计算机丢失shlwapi,请教高手提示shlwapi.dll错误应该怎么处理?
- java 电子签章 开源_java操作pdf制作电子签章 - CSDN博客
- Unity脚本:寻找血量最低的敌人
- day6--面向对象初识
- 生日快乐网页模板(HTML5+CSS3+JS)
- 时空旅行[线段树分治][维护凸壳]
- SVG进阶-SMIL动画
- SpringBoot+Vue实现前后端分离的在线考试报名系统
- Open GL 基础
- python写论文难吗_师兄一年发表5篇CSSCI,原来高手也用套路……
- TRS Database admin数据字段类型总结