面試隨筆---數字轉RMB中文 之 我的实现(含图)
面試隨筆---數字轉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;
}
}
}
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;
}
}
}