資源描述:
《小寫金額換為大寫金額實現(xiàn)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、前言 銀行、單位和個人填寫的各種票據(jù)和結(jié)算憑證是辦理支付結(jié)算和現(xiàn)金收付的重要依據(jù),直接關(guān)系到支付結(jié)算的準(zhǔn)確、及時和安全。票據(jù)和結(jié)算憑證是銀行、單位和個人憑以記載帳務(wù)的會計憑證,是記載經(jīng)濟(jì)業(yè)務(wù)和明確經(jīng)濟(jì)責(zé)任的一種書面證明。因此,填寫票據(jù)和結(jié)算憑證,必須做到標(biāo)準(zhǔn)化、規(guī)范化,要要素齊全、數(shù)字正確、字跡清晰、不錯漏、不潦草,防止涂改。 我的服務(wù)需要一個金額轉(zhuǎn)換過程,本來想在網(wǎng)上找,但都是C++、JavaScript、Delphi的Demo,還沒有C的。索性自己寫一個。參考了其它的轉(zhuǎn)換算法,對我有些啟
2、發(fā)?! 〈蠖嗟乃惴ǘ际侵苯臃治鲎址纱髮懡痤~,即存在一個假設(shè):源字符串的格式是正確的。在我的過程中,用狀態(tài)機(jī)的方法分析源字符串,錯誤時,返回空指針(我可不敢保證傳給我的過程的都是##.##)?!》治龀鲈醋址姓麛?shù)部有多少個數(shù)字,是否有小數(shù),統(tǒng)計結(jié)果放在一個結(jié)構(gòu)體中,整數(shù)和小數(shù)部分的數(shù)字分別放在兩個整形數(shù)組里?! ∮辛私y(tǒng)計數(shù)據(jù)就可以生成大寫金額了。轉(zhuǎn)換過程有個難點:要區(qū)分萬、億等“段”,特別是個位這個“段”,這個概念是在《小寫轉(zhuǎn)大寫金額在C++中的實現(xiàn)》文章中提到的。在下面的程序中用j=(s
3、ize-i-1)&0x3,實際上是j=(size-i-1)%4取模,j==0時為段尾,需要特殊處理。所有的處理都是圍繞0來進(jìn)行的,也就是說,0才是難點。 特殊位置的0,按段分,段中第一個非0數(shù)字前的0,可能有多個;段中兩個非0數(shù)字間的0;段尾的0;個位的0;十分位,角位置的0?! ×硗猓D(zhuǎn)換的一個重點是大寫金額的寫法,好像大多的算法都注重轉(zhuǎn)換過程而對這個問題沒有深究。我在文章后面附上轉(zhuǎn)換規(guī)則。下面是代碼1./**2.*@brief將源字符串中的小寫金額轉(zhuǎn)換為大寫格式3.*4.*@paramde
4、st目的字符串5.*@paramsrc??小寫金額字符串6.*@return7.*-NULL源字符串的格式錯誤,返回NULL8.*-非NULL目的字符串的首地址9.*@note轉(zhuǎn)換根據(jù):中國人民銀行會計司編寫的最新《企業(yè)、銀行正確辦理支付結(jié)算10.*????指南》的第114頁-第115頁11.*/12.char*chineseFee(char*dest,char*src)13.{14.??enum1.??{2.??????START,????????????//開始3.??????MINUS,?
5、???????????//負(fù)號4.??????ZEROINT,??????????//0整數(shù)5.??????INTEGER,??????????//整數(shù)6.??????DECIMAL,??????????//小數(shù)點7.??????DECIMALfRACTION,????//小數(shù)位8.??????END,????????????//結(jié)束9.??????ERROR????????????//錯誤10.??}status=START;11.??struct12.??{13.??????intminus
6、;????????//0為正,1為負(fù)14.??????intsizeInt;15.??????intsizeDecimal;16.??????intinteger[10];17.??????intdecimal[10];18.??}feeInfo;19.??char*NumberChar[]=20.??????{"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};21.??char*UnitChar[]=22.??????{"整","圓","拾","佰","仟","
7、萬","拾","佰","仟","億",23.??????"拾","佰","仟","萬億","拾","佰","仟","億億",24.??????"角","分","負(fù)","人民幣"};25.??????26.??int????i,j,size;????????//循環(huán)變量27.??int????zeroTag??????=0,??//0標(biāo)志28.????????decZeroTag????=0;29.????30.??char*??pDest??????=dest;31.??char*??pSrc?
8、???????=src;32.??33.??int*????pInt????????=feeInfo.integer;34.??int*????pDec????????=feeInfo.decimal;1.??2.??//初始化3.??feeInfo.sizeInt??????=0;4.??feeInfo.sizeDecimal??=0;5.??feeInfo.minus??????=0;6.??7.??//分析字符串8.??while(1)9.??{10.??????switch(*pSrc)