面試隨筆---數字轉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;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述