利用创建型工厂方法模式编写的小写数字金额转换为人民币大写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;
}
[解决办法]
学习了!!