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