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

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

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

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

        这是我做的测试截图:

NumbersHelper


        代码很短,功能部分大概 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;
        }

    }
}
posted @ 2009-08-25 18:48  陛下  阅读(307)  评论(1编辑  收藏  举报