仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 577|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET教程之C#2.0纯数学办法递回完成泉币数字转换中...

[复制链接]
飘灵儿 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:47:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。递回|泉币|中文|转换  比来因为项目标缘故原由,必要写一个泉币数字转换中文的算法,先在网了找了一下,了局发明无一列外都是用(Replace)交换的体例来完成的,以是想写个别的的算法;由于自己是学数学出生的,以是用纯数学的办法完成。
  注重:本文中的算法撑持小于1023(也就是9999亿兆)泉币数字转化。
  泉币中文申明:在申明代码之前,起首让我们回忆一下泉币的读法。
  10020002.23读为壹仟零贰万零贰元贰角叁分
  1020读为壹仟零贰拾元整。
  100000读为拾万元整
  0.13读为壹角叁分
 
  代码:
测试工程
staticvoidMain(string[]args)
{
Console.WriteLine("请输出金额");
stringinputNum=Console.ReadLine();
while(inputNum!="exit")
{
//泉币数字转化类
NumCastnc=newNumCast();

if(nc.IsValidated<string>(inputNum))
{
try
{
stringchineseCharacter=nc.ConvertToChinese(inputNum);
Console.WriteLine(chineseCharacter);
}
catch(Exceptioner)
{
Console.WriteLine(er.Message);
}
}
else
{
Console.WriteLine("分歧法的数字或格局");
}
Console.WriteLine("
请输出金额");
inputNum=Console.ReadLine();
}
Console.ReadLine();
}
测试了局以下:
泉币转化类(NumCast类)功效先容
1常量的划定
///<summary>
///数位
///</summary>
publicenumNumLevel{Cent,Chiao,Yuan,Ten,Hundred,Thousand,TenThousand,hundredMillon,Trillion};
///<summary>
///数位的指数
///</summary>
privateint[]NumLevelExponent=newint[]{-2,-1,0,1,2,3,4,8,12};
///<summary>
///数位的中笔墨符
///</summary>
privatestring[]NumLeverChineseSign=newstring[]{"分","角","元","拾","佰","仟","万","亿","兆"};
///<summary>
///年夜写字符
///</summary>
privatestring[]NumChineseCharacter=newstring[]{"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};

///<summary>
///整(当没有角分时)
///</summary>
privateconststringEndOfInt="整";
 
2:数字正当性考证,接纳正则表达式考证
///<summary>
///正则表达考证数字是不是正当
///</summary>
///<paramname="Num"></param>
///<returns></returns>
publicboolIsValidated<T>(TNum)
{
Regexreg=newRegex(@"^(([0])|([1-9]d{0,23}))(.d{1,2})?$");
if(reg.IsMatch(Num.ToString()))
{
returntrue;
}
returnfalse;
}

3:猎取数位比方1000的数位为NumLevel.Thousand
///<summary>
///猎取数字的数位 利用log
///</summary>
///<paramname="Num"></param>
///<returns></returns>
privateNumLevelGetNumLevel(doubleNum)
{
doublenumLevelLength;
NumLevelNLvl=newNumLevel();
if(Num>0)
{
numLevelLength=Math.Floor(Math.Log10(Num));
for(inti=NumLevelExponent.Length-1;i>=0;i--)
{
if(numLevelLength>=NumLevelExponent)
{
NLvl=(NumLevel)i;
break;
}
}
}
else
{
NLvl=NumLevel.Yuan;
}
returnNLvl;
}
4:判别数字之间是不是有跳位,也就是中文两头是不是要加零,比方1020就应当加零。
///<summary>
///是不是跳位
///</summary>
///<returns></returns>
privateboolIsDumpLevel(doubleNum)
{
if(Num>0)
{
NumLevel?currentLevel=GetNumLevel(Num);
NumLevel?nextLevel=null;
intnumExponent=this.NumLevelExponent[(int)currentLevel];
doublepostfixNun=Math.Round(Num%(Math.Pow(10,numExponent)),2);
if(postfixNun>0)
nextLevel=GetNumLevel(postfixNun);
if(currentLevel!=null&&nextLevel!=null)
{
if(currentLevel>nextLevel+1)
{
returntrue;
}
}
}
returnfalse;
}
5把长数字支解为两个较小的数字数组,比方把9999亿兆,支解为9999亿和0兆,
由于盘算机不撑持太长的数字。
///<summary>
///是不是年夜于兆,假如年夜于就把字符串分为两部分,
///一部分是兆之前的数字
///另外一部分是兆今后的数字
///</summary>
///<paramname="Num"></param>
///<returns></returns>
privateboolIsBigThanTillion(stringNum)
{
boolisBig=false;
if(Num.IndexOf(.)!=-1)
{
//假如年夜于兆
if(Num.IndexOf(.)>NumLevelExponent[(int)NumLevel.Trillion])
{
isBig=true;
}
}
else
{
//假如年夜于兆
if(Num.Length>NumLevelExponent[(int)NumLevel.Trillion])
{
isBig=true;
}
}
returnisBig;
}
///<summary>
///把数字字符串由‘兆’分隔两个
///</summary>
///<returns></returns>
privatedouble[]SplitNum(stringNum)
{
//兆的入手下手位
double[]TillionLevelNums=newdouble[2];
inttrillionLevelLength;
if(Num.IndexOf(.)==-1)
trillionLevelLength=Num.Length-NumLevelExponent[(int)NumLevel.Trillion];
else
trillionLevelLength=Num.IndexOf(.)-NumLevelExponent[(int)NumLevel.Trillion];
//兆以上的数字
TillionLevelNums[0]=Convert.ToDouble(Num.Substring(0,trillionLevelLength));
//兆以下的数字
TillionLevelNums[1]=Convert.ToDouble(Num.Substring(trillionLevelLength));
returnTillionLevelNums;
}
 

6是不是以“壹拾”开首,假如是就能够把它变成“拾”
boolisStartOfTen=false;
while(Num>=10)
{
if(Num==10)
{
isStartOfTen=true;
break;
}
//Num的数位
NumLevelcurrentLevel=GetNumLevel(Num);
intnumExponent=this.NumLevelExponent[(int)currentLevel];
Num=Convert.ToInt32(Math.Floor(Num/Math.Pow(10,numExponent)));
if(currentLevel==NumLevel.Ten&&Num==1)
{
isStartOfTen=true;
break;
}
}
returnisStartOfTen;
 

7兼并年夜于兆连个数组转化成的泉币字符串
///<summary>
///兼并分隔的数组中文泉币字符
///</summary>
///<paramname="tillionNums"></param>
///<returns></returns>
privatestringContactNumChinese(double[]tillionNums)
{
stringuptillionStr=CalculateChineseSign(tillionNums[0],NumLevel.Trillion,true,IsStartOfTen(tillionNums[0]));
stringdowntrillionStr=CalculateChineseSign(tillionNums[1],null,true,false);
stringchineseCharactor=string.Empty;
//分隔后的字符是不是有跳位
if(GetNumLevel(tillionNums[1]*10)==NumLevel.Trillion)
{
chineseCharactor=uptillionStr+NumLeverChineseSign[(int)NumLevel.Trillion]+downtrillionStr;
}
else
{
chineseCharactor=uptillionStr+NumLeverChineseSign[(int)NumLevel.Trillion];
if(downtrillionStr!="零元整")
{
chineseCharactor+=NumChineseCharacter[0]+downtrillionStr;
}
else
{
chineseCharactor+="元整";
}
}
returnchineseCharactor;
}

8:递回盘算泉币数字的中文
///<summary>
///盘算中笔墨符串
///</summary>
///<paramname="Num">数字</param>
///<paramname="NL">数位级别好比1000万的数位级别为万</param>
///<paramname="IsExceptTen">是不是以‘壹拾’开首</param>
///<returns>中文年夜写</returns>
publicstringCalculateChineseSign(doubleNum,NumLevel?NL,boolIsDump,boolIsExceptTen)
{
Num=Math.Round(Num,2);
boolisDump=false;
//Num的数位
NumLevel?currentLevel=GetNumLevel(Num);
intnumExponent=this.NumLevelExponent[(int)currentLevel];
stringResult=string.Empty;
//整除后的了局
intprefixNum;
//余数当为小数的时分份子分母各乘100
doublepostfixNun;
if(Num>=1)
{
prefixNum=Convert.ToInt32(Math.Floor(Num/Math.Pow(10,numExponent)));
postfixNun=Math.Round(Num%(Math.Pow(10,numExponent)),2);
}
else
{
prefixNum=Convert.ToInt32(Math.Floor(Num*100/Math.Pow(10,numExponent+2)));
postfixNun=Math.Round(Num*100%(Math.Pow(10,numExponent+2)),2);
postfixNun*=0.01;
}
if(prefixNum<10)
{
//制止以‘壹拾’开首
if(!(NumChineseCharacter[(int)prefixNum]==NumChineseCharacter[1]
&&currentLevel==NumLevel.Ten&&IsExceptTen))
{
Result+=NumChineseCharacter[(int)prefixNum];
}
else
{
IsExceptTen=false;
}
//加上单元
if(currentLevel==NumLevel.Yuan)
{
////当为“元”位不为零时加“元”。
if(NL==null)
{
Result+=NumLeverChineseSign[(int)currentLevel];
//当小数点后为零时加"整"
if(postfixNun==0)
{
Result+=EndOfInt;
}
}
}
else
{
Result+=NumLeverChineseSign[(int)currentLevel];
}
//认真正的个位为零时 加上“元”
if(NL==null&&postfixNun<1&&currentLevel>NumLevel.Yuan&&postfixNun>0)
{
Result+=NumLeverChineseSign[(int)NumLevel.Yuan];
}

}
else
{
//当前缀数字未被除尽时,递回下往
NumLevel?NextNL=null;
if((int)currentLevel>=(int)(NumLevel.TenThousand))
NextNL=currentLevel;
Result+=CalculateChineseSign((double)prefixNum,NextNL,isDump,IsExceptTen);
if((int)currentLevel>=(int)(NumLevel.TenThousand))
{
Result+=NumLeverChineseSign[(int)currentLevel];
}
}
//是不是跳位
//判别是不是加零,好比302就要给三百前面加零,变成三百零二。
if(IsDumpLevel(Num))
{
Result+=NumChineseCharacter[0];
isDump=true;
}
//余数是不是必要递回
if(postfixNun>0)
{
Result+=CalculateChineseSign(postfixNun,NL,isDump,false);
}
elseif(postfixNun==0&&currentLevel>NumLevel.Yuan)
{
//当数字是以零元开头的加上元整好比1000000一百万元整
if(NL==null)
{
Result+=NumLeverChineseSign[(int)NumLevel.Yuan];
Result+=EndOfInt;
}
}
returnResult;
}
 

9:内部挪用的转换办法。
///<summary>
///内部挪用的转换办法
///</summary>
///<paramname="Num"></param>
///<returns></returns>
publicstringConvertToChinese(stringNum)
{
if(!IsValidated<string>(Num))
{
thrownewOverflowException("数值格局不准确,请输出小于9999亿兆的数字且最多准确的分的金额!");
}
stringchineseCharactor=string.Empty;
if(IsBigThanTillion(Num))
{
double[]tillionNums=SplitNum(Num);
chineseCharactor=ContactNumChinese(tillionNums);
}
else
{
doubledNum=Convert.ToDouble(Num);
chineseCharactor=CalculateChineseSign(dNum,null,true,IsStartOfTen(dNum));
}
returnchineseCharactor;
}
 
  小结:
  团体以为程序的魂灵是算法,年夜到一个体系中的营业逻辑,小到一个泉币数字转中文的算法,到处都表现一种逻辑头脑。
  是不是能把需求笼统成一个好的数学模子,间接干系到程序的完成的庞大度和不乱性。在一些经常使用功效中想些纷歧样的算法,对我们开辟思绪很有匡助。
不可能天天有学习.net),我一同学说,你应该早就有作品啦。我惶惶然……
飘灵儿 该用户已被删除
沙发
 楼主| 发表于 2015-1-19 23:51:30 | 只看该作者
我觉得什么语言,精通就好,你要做的就是比其他80%的人都厉害,你就能得到只有20%的人才能得到的高薪。
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-1-26 22:52:39 | 只看该作者
最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
冷月葬花魂 该用户已被删除
地板
发表于 2015-2-4 21:17:56 | 只看该作者
碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。
柔情似水 该用户已被删除
5#
发表于 2015-2-10 12:20:28 | 只看该作者
在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?
再见西城 该用户已被删除
6#
发表于 2015-3-1 10:39:01 | 只看该作者
主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。
小魔女 该用户已被删除
7#
发表于 2015-3-10 14:58:55 | 只看该作者
网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
兰色精灵 该用户已被删除
8#
发表于 2015-3-17 08:09:45 | 只看该作者
ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。
变相怪杰 该用户已被删除
9#
发表于 2015-3-24 03:24:16 | 只看该作者
虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-18 07:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表