|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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]
&¤tLevel==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&¤tLevel>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&¤tLevel>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),我一同学说,你应该早就有作品啦。我惶惶然…… |
|