1 2 3 //测试工程4 5 staticvoidMain(string[] args)6 7 {8 9 Console.WriteLine("请输入金额");10 11 stringinputNum=Console.ReadLine();12 13 while(inputNum!="exit")14 15 {16 17 //货币数字转化类18 19 NumCast nc=newNumCast();20 21 if(nc.IsValidated(inputNum))22 23 {24 25 try26 27 {28 29 stringchineseCharacter=nc.ConvertToChinese(inputNum);30 31 Console.WriteLine(chineseCharacter);32 33 }34 35 catch(Exception er)36 37 {38 39 Console.WriteLine(er.Message);40 41 }42 43 }44 45 else46 47 {48 49 Console.WriteLine("不合法的数字或格式");50 51 }52 53 Console.WriteLine("\n请输入金额");54 55 inputNum=Console.ReadLine();56 57 }58 59 Console.ReadLine();60 61 }62 63 测试结果如下:64 65 货币转化类(NumCast类)功能介绍66 67 1常量的规定68 69 ///70 71 ///数位72 73 ///74 75 publicenumNumLevel { Cent, Chiao, Yuan, Ten, Hundred, Thousand, TenThousand, hundredMillon, Trillion };76 77 ///78 79 ///数位的指数80 81 ///82 83 privateint[] NumLevelExponent=newint[] {-2,-1,0,1,2,3,4,8,12};84 85 ///86 87 ///数位的中文字符88 89 ///90 91 privatestring[] NumLeverChineseSign=newstring[] {"分","角","元","拾","佰","仟","万","亿","兆"};92 93 ///94 95 ///大写字符96 97 ///98 99 privatestring[] NumChineseCharacter=newstring[] {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};100 101 ///102 103 ///整(当没有 角分 时)104 105 ///106 107 privateconststringEndOfInt="整";108 109 2:数字合法性验证,采用正则表达式验证110 111 ///112 113 ///正则表达验证数字是否合法114 115 ///116 117 ///118 119 ///120 121 publicboolIsValidated(T Num)122 123 {124 125 Regex reg=newRegex(@"^(([0])|([1-9]\d{0,23}))(\.\d{1,2})?$");126 127 if(reg.IsMatch(Num.ToString()))128 129 {130 131 returntrue;132 133 }134 135 returnfalse;136 137 }138 139 3: 获取数位 例如 1000的数位为 NumLevel.Thousand140 141 142 143 ///144 145 ///获取数字的数位 使用log146 147 ///148 149 ///150 151 ///152 153 privateNumLevel GetNumLevel(doubleNum)154 155 {156 157 doublenumLevelLength;158 159 NumLevel NLvl=newNumLevel();160 161 if(Num>0)162 163 {164 165 numLevelLength=Math.Floor(Math.Log10(Num));166 167 for(inti=NumLevelExponent.Length-1; i>=0; i--)168 169 {170 171 if(numLevelLength>=NumLevelExponent[i])172 173 {174 175 NLvl=(NumLevel)i;176 177 break;178 179 }180 181 }182 183 }184 185 else186 187 {188 189 NLvl=NumLevel.Yuan;190 191 }192 193 returnNLvl;194 195 }196 197 4:判断数字之间是否有跳位,也就是中文中间是否要加零,例如1020 就应该加零。198 199 ///200 201 ///是否跳位202 203 ///204 205 ///206 207 privateboolIsDumpLevel(doubleNum)208 209 {210 211 if(Num>0)212 213 {214 215 NumLevel?currentLevel=GetNumLevel(Num);216 217 NumLevel?nextLevel=null;218 219 intnumExponent=this.NumLevelExponent[(int)currentLevel];220 221 doublepostfixNun=Math.Round(Num%(Math.Pow(10, numExponent)),2);222 223 if(postfixNun>0)224 225 nextLevel=GetNumLevel(postfixNun);226 227 if(currentLevel!=null&&nextLevel!=null)228 229 {230 231 if(currentLevel>nextLevel+1)232 233 {234 235 returntrue;236 237 }238 239 }240 241 }242 243 returnfalse;244 245 }246 247 5把长数字分割为两个较小的数字数组,例如把9999亿兆,分割为9999亿和0兆,248 249 因为计算机不支持过长的数字。250 251 ///252 253 ///是否大于兆,如果大于就把字符串分为两部分,254 255 ///一部分是兆以前的数字256 257 ///另一部分是兆以后的数字258 259 ///260 261 ///262 263 ///264 265 privateboolIsBigThanTillion(stringNum)266 267 {268 269 boolisBig=false;270 271 if(Num.IndexOf('.')!=-1)272 273 {274 275 //如果大于兆276 277 if(Num.IndexOf('.')>NumLevelExponent[(int)NumLevel.Trillion])278 279 {280 281 isBig=true;282 283 }284 285 }286 287 else288 289 {290 291 //如果大于兆292 293 if(Num.Length>NumLevelExponent[(int)NumLevel.Trillion])294 295 {296 297 isBig=true;298 299 }300 301 }302 303 returnisBig;304 305 }306 307 ///308 309 ///把数字字符串由‘兆’分开两个310 311 ///312 313 ///314 315 privatedouble[] SplitNum(stringNum)316 317 {318 319 //兆的开始位320 321 double[] TillionLevelNums=newdouble[2];322 323 inttrillionLevelLength;324 325 if(Num.IndexOf('.')==-1)326 327 trillionLevelLength=Num.Length-NumLevelExponent[(int)NumLevel.Trillion];328 329 else330 331 trillionLevelLength=Num.IndexOf('.')-NumLevelExponent[(int)NumLevel.Trillion];332 333 //兆以上的数字334 335 TillionLevelNums[0]=Convert.ToDouble(Num.Substring(0, trillionLevelLength));336 337 //兆以下的数字338 339 TillionLevelNums[1]=Convert.ToDouble(Num.Substring(trillionLevelLength ));340 341 returnTillionLevelNums;342 343 }344 345 346 347 6是否以“壹拾”开头,如果是就可以把它变为“拾”348 349 boolisStartOfTen=false;350 351 while(Num>=10)352 353 {354 355 if(Num==10)356 357 {358 359 isStartOfTen=true;360 361 break;362 363 }364 365 //Num的数位366 367 368 NumLevel currentLevel=GetNumLevel(Num);369 370 intnumExponent=this.NumLevelExponent[(int)currentLevel];371 372 Num=Convert.ToInt32(Math.Floor(Num/Math.Pow(10, numExponent)));373 374 if(currentLevel==NumLevel.Ten&&Num==1)375 376 {377 378 isStartOfTen=true;379 380 break;381 382 }383 384 }385 386 returnisStartOfTen;387 388 7合并大于兆连个数组转化成的货币字符串389 390 ///391 392 ///合并分开的数组中文货币字符393 394 ///395 396 ///397 398 ///399 400 privatestringContactNumChinese(double[] tillionNums)401 402 {403 404 stringuptillionStr=CalculateChineseSign(tillionNums[0], NumLevel.Trillion,true, IsStartOfTen(tillionNums[0]));405 406 stringdowntrillionStr=CalculateChineseSign(tillionNums[1],null,true,false);407 408 stringchineseCharactor=string.Empty;409 410 //分开后的字符是否有跳位411 412 if(GetNumLevel(tillionNums[1]*10)==NumLevel.Trillion)413 414 {415 416 chineseCharactor=uptillionStr+NumLeverChineseSign[(int)NumLevel.Trillion]+downtrillionStr;417 418 }419 420 else421 422 {423 424 chineseCharactor=uptillionStr+NumLeverChineseSign[(int)NumLevel.Trillion];425 426 if(downtrillionStr!="零元整")427 428 {429 430 chineseCharactor+=NumChineseCharacter[0]+downtrillionStr;431 432 }433 434 else435 436 {437 438 chineseCharactor+="元整";439 440 }441 442 }443 444 returnchineseCharactor;445 446 }447 448 8:递归计算货币数字的中文449 450 ///451 452 ///计算中文字符串453 454 ///455 456 ///数字457 458 ///数位级别 比如1000万的 数位级别为万459 460 ///是否以‘壹拾’开头461 462 ///中文大写463 464 publicstringCalculateChineseSign(doubleNum, NumLevel?NL ,boolIsDump,boolIsExceptTen)465 466 {467 468 Num=Math.Round(Num,2);469 470 boolisDump=false;471 472 //Num的数位473 474 NumLevel?currentLevel=GetNumLevel(Num);475 476 intnumExponent=this.NumLevelExponent[(int)currentLevel];477 478 stringResult=string.Empty;479 480 //整除后的结果481 482 intprefixNum;483 484 //余数 当为小数的时候 分子分母各乘100485 486 doublepostfixNun ;487 488 if(Num>=1)489 490 {491 492 prefixNum=Convert.ToInt32(Math.Floor(Num/Math.Pow(10, numExponent)));493 494 postfixNun=Math.Round(Num%(Math.Pow(10, numExponent)),2);495 496 }497 498 else499 500 {501 502 prefixNum=Convert.ToInt32(Math.Floor(Num*100/Math.Pow(10, numExponent+2)));503 504 postfixNun=Math.Round(Num*100%(Math.Pow(10, numExponent+2)),2);505 506 postfixNun*=0.01;507 508 }509 510 if(prefixNum<10)511 512 {513 514 //避免以‘壹拾’开头515 516 if(!(NumChineseCharacter[(int)prefixNum]==NumChineseCharacter[1]517 518 &¤tLevel==NumLevel.Ten&&IsExceptTen))519 520 {521 522 Result+=NumChineseCharacter[(int)prefixNum];523 524 }525 526 else527 528 {529 530 IsExceptTen=false;531 532 }533 534 //加上单位535 536 if(currentLevel==NumLevel.Yuan )537 538 {539 540 当为 “元” 位不为零时 加“元”。541 542 if(NL==null)543 544 {545 546 Result+=NumLeverChineseSign[(int)currentLevel];547 548 //当小数点后为零时 加 "整"549 550 if(postfixNun==0)551 552 {553 554 Result+=EndOfInt;555 556 }557 558 }559 560 }561 562 else563 564 {565 566 Result+=NumLeverChineseSign[(int)currentLevel];567 568 }569 570 //当真正的个位为零时 加上“元”571 572 if(NL==null&&postfixNun<1&¤tLevel>NumLevel.Yuan&&postfixNun>0)573 574 {575 576 Result+=NumLeverChineseSign[(int)NumLevel.Yuan];577 578 }579 580 }581 582 else583 584 {585 586 //当 前缀数字未被除尽时, 递归下去587 588 NumLevel?NextNL=null;589 590 if((int)currentLevel>=(int)(NumLevel.TenThousand))591 592 NextNL=currentLevel;593 594 Result+=CalculateChineseSign((double)prefixNum, NextNL, isDump, IsExceptTen);595 596 if((int)currentLevel>=(int)(NumLevel.TenThousand))597 598 {599 600 Result+=NumLeverChineseSign[(int)currentLevel];601 602 }603 604 }605 606 //是否跳位607 608 //判断是否加零, 比如302 就要给三百 后面加零,变为 三百零二。609 610 if(IsDumpLevel(Num))611 612 {613 614 Result+=NumChineseCharacter[0];615 616 isDump=true;617 618 }619 620 //余数是否需要递归621 622 if(postfixNun>0)623 624 {625 626 Result+=CalculateChineseSign(postfixNun, NL, isDump,false);627 628 }629 630 elseif(postfixNun==0&¤tLevel>NumLevel.Yuan )631 632 {633 634 //当数字是以零元结尾的加上 元整 比如1000000一百万元整635 636 if(NL==null)637 638 {639 640 Result+=NumLeverChineseSign[(int)NumLevel.Yuan];641 642 Result+=EndOfInt;643 644 }645 646 }647 648 returnResult;649 650 }651 652 9:外部调用的转换方法。653 654 ///655 656 ///外部调用的转换方法657 658 ///659 660 ///661 662 ///663 664 665 publicstringConvertToChinese(stringNum)666 667 {668 669 if(!IsValidated(Num))670 671 {672 673 thrownewOverflowException("数值格式不正确,请输入小于9999亿兆的数字且最多精确的分的金额!");674 675 }676 677 stringchineseCharactor=string.Empty;678 679 if(IsBigThanTillion(Num))680 681 {682 683 double[] tillionNums=SplitNum(Num);684 685 chineseCharactor=ContactNumChinese(tillionNums);686 687 }688 689 else690 691 {692 693 doubledNum=Convert.ToDouble(Num);694 695 chineseCharactor=CalculateChineseSign(dNum,null,true, IsStartOfTen(dNum));696 697 }698 699 returnchineseCharactor;700 701 }702 703 704