首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

利用创建型工厂方法模式编写的小写数字金额转换为人民币大写c#代码解决办法

2012-01-12 
利用创建型工厂方法模式编写的小写数字金额转换为人民币大写c#代码初学者你就模仿学一学,IT专家你就出谋指

利用创建型工厂方法模式编写的小写数字金额转换为人民币大写c#代码
初学者你就模仿学一学,IT专家你就出谋指点指点。
本人csdn博客:http://blog.csdn.net/lanpeng
本人将志愿贡献源代码。多谢大家支持。散分100分
(在网上大家绝不可能找到雷同的代码。这全是我本人亲自构思并编写出来的。如有一定是来自于此处或我的博客转载或是直接抄袭。)

/*
  *   功能描述:利用创建型工厂方法模式小写数字金额转换为人民币大写。
  *   设计思想:利用创建型工厂方法模式。
  *   编程语言:c#.
  *   调用说明:
  *   在需要调用的程序开头
  *   using   NSNumTranslateFactory
  *   using   NSNumToCht;//用于转换成繁体
      using   NSNumToChs;//用于转换成简体
  *   调用处如下:
  *   NumToCht   num1   =   new   NumToCht();//要转换成繁体就new   一个繁体
  *   NumToChs   num2   =   new   NumToChs();//要转换成简体就new   一个简体
  *  
  *   System.Console.WriteLine(num1.GetTransResult(407209806.2675,   3));//GetTransResult(double   Num,int   DeciCount)为公布之接口。
  *   本程序作者:冯鹏飞     -兰鹏电脑软件开发部总工程师。
  *   第一次编写和修改时间:2007-04-26
  *   第一次出现在网上时间和网站:2007-04-27   兰鹏电脑http://www.lanpeng.net.cn
  *   与作者联系:andyfpf@gmail.com
  *   MSN:andyfpf@gmail.com
  *   skype:andyfpf
  *   QQ:25063861
  *   本作者将帅先并长期无私贡献自已的源代码。目的在于开源和促进整个IT行业的和谐发展。请广为传播。
  *   郑重声明:凡是出自本作者冯鹏飞的源代码均为本作者冯鹏飞多年的IT行业汗水结晶。
  *   未经本作者冯鹏飞同意   严禁用于商业目的。并在程序使用处保留此注释,并注明作者信息和出处。
  *   违者必究其版权责任。
  *   欢迎与作者联系和交流。
  *   */
using   NSNumTranslateFactory;
namespace   NSNumToChs
{
        public   class   NumToChs   :   NumTranslateFactory
        {
                private   string   StIntUnit   =   "萬千佰拾億千佰拾萬千佰拾元角分厘毫 ";
             
                private   string   StCht   =   "零壹貳參肆伍陸柒捌玫 ";
             
                public   override   string   GetTransResult(double   Num,   int   DigCount)
                {
                       
                        int   NumLen;
                        string   StIntResult   =   " ",   StActuUnit   =   " ";
                   
                        Num   =   System.Math.Round(Num,   DigCount);
                        Num   =   Num   *   System.Math.Pow(10,   DigCount);
                        string   StNum   =   Num.ToString();
                        NumLen   =   Num.ToString().Length;
                        StActuUnit   =   StIntUnit.Substring(12+DigCount   -   NumLen   +   1,   NumLen);
                        for   (int   i   =   0;   i   <   NumLen;   i++)//connect   the   stnumtemp   and   stint


                        {
                                StIntResult   =   StIntResult   +   StCht[StNum[i]   -   48]   +   StActuUnit[i];

                        }
                        StIntResult   =   StIntResult.Replace( "零拾 ",   "零 ");

                        StIntResult   =   StIntResult.Replace( "零佰 ",   "零 ");
                        StIntResult   =   StIntResult.Replace( "零千 ",   "零 ");


                        StIntResult   =   StIntResult.Replace( "零角 ",   "零 ");
                        StIntResult   =   StIntResult.Replace( "零分 ",   "零 ");
                        StIntResult   =   StIntResult.Replace( "零厘 ",   "零 ");
                        StIntResult   =   StIntResult.Replace( "零毫 ",   "零 ");

                        StIntResult   =   StIntResult.Replace( "零萬 ",   "萬 ");
                        StIntResult   =   StIntResult.Replace( "零億 ",   "億 ");
                        StIntResult   =   StIntResult.Replace( "零元 ",   "元 ");

                        StIntResult   =   StIntResult.Replace( "零零零 ",   "零 ");
                        StIntResult   =   StIntResult.Replace( "零零 ",   "零 ");
                        if   (StIntResult[StIntResult.Length-1]== '零 ')
                        {
                              StIntResult   =   StIntResult.Substring(0,   StIntResult.Length   -   1);
                               
                        }
                        return   StIntResult;
                }

        }
}



[解决办法]
jf
[解决办法]
收藏ing
------解决方案--------------------


设计模式是用在做架构上...

光是实现一个转换算法,却硬扯上模式,模式中毒了...


[解决办法]
呵呵
[解决办法]
帮顶
[解决办法]
学习
[解决办法]
你这个 算法 和 工厂 有什么联系哦?
或者 说

算法 和 模式 没有 必然的联系.
[解决办法]
jf
[解决办法]
jf
[解决办法]
原来类名叫XXXFactory就是工程模式,明白了
[解决办法]
没看到比我的好在哪,去我的BLOG看看吧,大小写转换都有,简单一个类而已,搞这么复杂

模式还有这么用的,真受不了,这个用函数重载足够了
[解决办法]
顶下。接分。
[解决办法]
http://blog.csdn.net/honkerhero/archive/2007/02/02/1500684.aspx
[解决办法]
GetTransResult(1000003,2)
壹佰零萬零參元

扔开模式不说,算法就不正确...
[解决办法]
honkerhero(做事先做人)

这位同志的代码看过了,暂时没有发现问题

123123123123
壹仟贰佰叁拾壹亿贰仟叁佰壹拾贰万叁仟壹佰贰拾
[解决办法]
mark
[解决办法]
太多错的了,不好用
[解决办法]
收藏
[解决办法]
这个……应该用Locale吧?
[解决办法]
不错
[解决办法]
其实这东西谁都能写。关键的的是算法的优化。这个我看还比较不错。
[解决办法]
踩踩...
[解决办法]
up
[解决办法]
接分


不是什么东西都要使用设计模式的
[解决办法]
lanpeng()

我用的是位权的算法,不知道你的DIGCOUNT是做什么的

还有,多语言格式化跟你说的这又是两回事,如果日文转化的话,我可以再起一类,工厂模式不应该用在这里,要用也是在该类的上一层,本类的格式转化与工厂模式不应该有关系的

类实现的是业务逻辑,模式实现的开-闭原则,你是不是搞混了
[解决办法]
lz开源精神值得学习!!!
如果能将工厂类、接口、实现类分开描述一下,对初学者可能会更明白些,否则给人感觉和工厂关系不大。
[解决办法]
10128763 一个C#/SQL群
[解决办法]
另外,我觉得不能为了设计模式而使用模式,应该在比较需要的的时候去使用。我觉得仅实现这个功能,有更好的办法。
因为我们不难发现,完成小写转化大写并适应简繁中文这个功能,其实可以分为两部分,算法是不变的,文字(简体或繁体)是变化的,那么是不是考虑写一个算法,将“万千百十元角分”的简体或繁体信息作为参数即可适应。如果非要类里完成,那么也可以将这些参数作为类的构造函数的参数传进去,当然调用层也可以在用工厂类去做,不影响。

纯技术讨论,多提意见。
[解决办法]
楼上正解,当时我也这么想的,只不过当时觉得够用,没有再加工而已
------解决方案--------------------


原来真的是名字加上Factory就是工厂模式啊
[解决办法]
长见识了,创建型工厂方法模式……

啥时候冒出来的?
[解决办法]
我提点儿不成熟的意见吧,您这段代码如果交到我这里,会发还回去全部重写:

1、变量没用Camel方式命名。
2、大量使用缩写,还很离谱,St是String?还是“圣”?St. John(圣·约翰)。
3、没有使用StringBuilder
4、开篇的长篇大论与算法内部的注释完全不成比例……
[解决办法]
打渔的人就是狠啊
[解决办法]
1、微软的类库的设计指南明确指出了Pascal 大小写与Camel 大小写的适用场景
2、呵呵,这个规范我咋没见过呢?但有下列内容:
2.1、微软的类库的设计指南有明确指出使用缩写的规范,绝对没有断词缩写一说
2.2、微软的类库的设计指南有明确指出不要使用匈牙利表示法。
2.3、即使是匈牙利命名法,也是sResult或s_result。
3、StringBuilder在这里能提升不小的效率,但这还不是其唯一目的,简化代码的作用也不小。
[解决办法]
jf
[解决办法]
JF

[解决办法]
//3、StringBuilder在这里能提升不小的效率,但这还不是其唯一目的,简化代码的作用也不小。

--------------------------------------------
汗了,我的代码比他的多几倍

http://blog.csdn.net/honkerhero/archive/2007/02/02/1500684.aspx

打渔的也来给指点一下吧,我工作才1年多,感觉很多地方都不足啊,包括实义命名
[解决办法]
好玩,俺也写个去
[解决办法]
public static string RMB(double input)
{
string nums = "零壹贰叁肆伍陆柒捌玖";
string mete = "拾佰仟";
string unit = "元万亿兆京";
double dotleft = Math.Truncate(input);
double dotright = Math.Round(input - dotleft, 2);
string revalue = string.Empty;

#region 小数部分
if (dotright > 0)
{
int fen = (int)((dotright * 100) % 10);
int jiao = (int)((dotright * 10) % 10);
if (fen > 0)
{
revalue = nums[fen] + "分" + revalue;
}
if (jiao > 0)
{
revalue = nums[jiao] + "角" + revalue;
}
}
else
{
revalue = "整" + revalue;
}

#endregion


#region 整数部分

double spare = dotleft;
for (int i = 0; spare >= 1 && i < unit.Length; i++)
{
int n4 = (int)(spare % 10000);
spare = spare / 10000;

if (n4 > 0 || i == 0)
{
revalue = unit[i] + revalue;
}

for (int j = 0; n4 > 0; j++)
{
int cn = n4 % 10;

n4 = n4 / 10;

if (cn != 0)
{
if (j > 0)
{//非个位数
revalue = nums[cn].ToString() + mete[j - 1].ToString() + revalue;
}
else
{//个位数
revalue = nums[cn].ToString() + revalue;
}
}
else
{
if (j > 0 && nums.Contains(revalue[0].ToString()) && !revalue[0].Equals(nums[cn]))
{//该0非个位数且后面以1-9连接


revalue = nums[0].ToString() + revalue;
}
}

//补零
if (spare >= 1 && n4 == 0 && j < 3)
{//当前非千位数且高位数均为0,并且存在下一个四位分段数
revalue = nums[0].ToString() + revalue;
}
}
}
#endregion

return revalue;
}
[解决办法]
学习了!!

热点排行