小写金额转换为大写金额(C实现).doc_第1页
小写金额转换为大写金额(C实现).doc_第2页
小写金额转换为大写金额(C实现).doc_第3页
小写金额转换为大写金额(C实现).doc_第4页
小写金额转换为大写金额(C实现).doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前言银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、及时和安全。票据和结算凭证是银行、单位和个人凭以记载帐务的会计凭证,是记载经济业务和明确经济责任的一种书面证明。因此,填写票据和结算凭证,必须做到标准化、规范化,要要素齐全、数字正确、字迹清晰、不错漏、不潦草,防止涂改。我的服务需要一个金额转换过程,本来想在网上找,但都是C+、JavaScript、Delphi的Demo,还没有C的。索性自己写一个。参考了其它的转换算法,对我有些启发。大多的算法都是直接分析字符串生成大写金额,即存在一个假设:源字符串的格式是正确的。在我的过程中,用状态机的方法分析源字符串,错误时,返回空指针(我可不敢保证传给我的过程的都是#.#)。分析出源字符串中整数部有多少个数字,是否有小数,统计结果放在一个结构体中,整数和小数部分的数字分别放在两个整形数组里。有了统计数据就可以生成大写金额了。转换过程有个难点:要区分万、亿等“段”,特别是个位这个“段”,这个概念是在小写转大写金额在C+中的实现文章中提到的。在下面的程序中用j= ( size - i - 1 ) & 0x3,实际上是j = ( size - i - 1 ) % 4取模,j=0时为段尾,需要特殊处理。所有的处理都是围绕0来进行的,也就是说,0才是难点。特殊位置的0,按段分,段中第一个非0数字前的0,可能有多个;段中两个非0数字间的0;段尾的0;个位的0;十分位,角位置的0。另外,转换的一个重点是大写金额的写法,好像大多的算法都注重转换过程而对这个问题没有深究。我在文章后面附上转换规则。下面是代码1. /*2. * brief 将源字符串中的小写金额转换为大写格式3. *4. * param dest 目的字符串5. * param src小写金额字符串6. * return 7. * - NULL 源字符串的格式错误,返回NULL8. * - 非NULL 目的字符串的首地址9. * note 转换根据:中国人民银行会计司编写的最新企业、银行正确办理支付结算10. * 指南的第114页-第115页11. */12. char* chineseFee( char* dest, char* src )13. 14. enum15. 16. START, /开始17. MINUS, /负号18. ZEROINT, /0整数19. INTEGER, /整数20. DECIMAL, /小数点21. DECIMALfRACTION, /小数位22. END, /结束23. ERROR /错误24. status = START;25. struct26. 27. int minus; /0为正,1为负28. int sizeInt;29. int sizeDecimal;30. int integer10;31. int decimal10;32. feeInfo;33. char* NumberChar = 34. 零, 壹, 贰, 叁, 肆, 伍, 陆, 柒, 捌, 玖 ;35. char* UnitChar = 36. 整, 圆, 拾, 佰,仟, 万, 拾, 佰, 仟, 亿, 37. 拾, 佰, 仟, 万亿, 拾, 佰, 仟, 亿亿, 38. 角, 分, 负, 人民币 ;39. 40. int i, j,size; /循环变量41. int zeroTag = 0, /0标志42. decZeroTag = 0;43. 44. char* pDest = dest;45. char* pSrc = src;46. 47. int* pInt = feeIeger;48. int* pDec = feeInfo.decimal;49. 50. /初始化51. feeInfo.sizeInt = 0;52. feeInfo.sizeDecimal = 0;53. feeInfo.minus = 0;54. 55. /分析字符串56. while( 1 )57. 58. switch ( *pSrc )59. 60. case - :61. status = ( status = START ) ? MINUS : ERROR;62. feeInfo.minus = ( status = MINUS ) ? 1 : 0;63. break;64. case 1 :65. case 2 :66. case 3 :67. case 4 :68. case 5 :69. case 6 :70. case 7 :71. case 8 :72. case 9 :73. case 0 :74. if ( *pSrc = 0 & status = ZEROINT )/| status = START ) )75. 76. status = ERROR;77. break;78. 79. if ( status = MINUS | status = START | status = INTEGER )80. 81. if ( *pSrc = 0 & ( status = MINUS | status = START ) )82. status = ZEROINT;83. else84. status = INTEGER;85. *pInt = (*pSrc) - 48;86. +pInt;87. +feeInfo.sizeInt;88. 89. else if ( status = DECIMAL | status = DECIMALfRACTION )90. 91. status = DECIMALfRACTION;92. *pDec = (*pSrc) - 48;93. +pDec;94. +feeInfo.sizeDecimal;95. 96. else97. 98. status =ERROR;99. 100. break;101. case . :102. status = ( status = INTEGER | status = ZEROINT ) 103. ? DECIMAL : ERROR;104. break;105. case 0 :106. status = ( status = INTEGER | status = DECIMALfRACTION 107. | status = ZEROINT ) ? END : ERROR;108. break;109. default :110. status = ERROR;111. 112. if ( status = END ) 113. break;114. else if ( status = ERROR )115. return NULL;116. 117. +pSrc;118. 119. 120. /只有1位小数时,设置百分位为0,使下面代码不需要区分这两种情况121. if ( feeInfo.sizeDecimal = 1 )122. 123. feeInfo.decimal 1 = 0;124. +feeInfo.sizeDecimal;125. 126. /判断是否需要打印小数部分,有小数部且十分位和百分位不都为0127. /需要打印小数部时,zeroTag设为0,否则设为1128. if ( feeInfo.sizeDecimal = 0 /没有小数129. | ( !feeInfo.decimal 0 & !feeInfo.decimal 1 ) ) /小数部都为0130. decZeroTag = 1;131. else132. decZeroTag = 0;133. 134. /printf( int size: %d decimal size: %dn, feeInfo.sizeInt, feeInfo.sizeDecimal );135. 136. strcpy( pDest, UnitChar 21 ); /初始化目标字符串-人民币137. 138. if ( feeInfo.minus ) strcat( pDest, UnitChar 20 ); /负号139. 140. /处理整数部分141. size = feeInfo.sizeInt;142. for( i = 0; i size; +i )143. 144. j = size - i - 1 & 0x3; /j = 0时为段尾145. if ( feeIeger i = 0 & j ) /处理非段尾0146. 147. zeroTag = 1;148. 149. else if ( feeIeger i = 0 & !j ) /处理段尾0150. 151. if ( feeInfo.sizeInt = 1 & decZeroTag ) /特殊处理个位0152. strcat( pDest, NumberChar feeIeger i );153. if ( feeInfo.sizeInt != 1 | decZeroTag )154. strcat( pDest, UnitChar size - i );155. zeroTag = 0;156. 157. else /处理非0158. 159. if ( zeroTag )160. 161. strcat( pDest, NumberChar 0 );162. zeroTag = 0;163. 164. strcat( pDest, NumberChar feeIeger i );165. strcat( pDest, UnitChar size - i );166. if ( !j ) zeroTag = 0; /如果是段尾,设为非标志167. 168. 169. 170. if ( decZeroTag )171. 172. strcat( pDest, UnitChar 0 );/没有小数部,打印整字符173. 174. else175. 176. /十分位177. if ( feeInfo.decimal 0 )178. 179. strcat( pDest, NumberChar feeInfo.decimal 0 );180. strcat( pDest, UnitChar 18 );181. 182. else if ( feeInfo.sizeInt != 1 | feeIeger 0 )183. 184. strcat( pDest, NumberChar feeInfo.decimal 0 );185. 186. 187. /百分位不为0时188. if ( feeInfo.decimal 1 ) 189. 190. strcat( pDest, NumberChar feeInfo.decimal 1 );191. strcat( pDest, UnitChar 19 );192. 193. 194. return dest;195. 复制代码代码中有些地方没有注释清楚,要是有不明白的可以E-Mail我z_。参考:小写转大写金额在C+中的实现附:正确填写票据和结算凭证的基本规定银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、及时和安全。票据和结算凭证是银行、单位和个人凭以记载帐务的会计凭证,是记载经济业务和明确经济责任的一种书面证明。因此,填写票据和结算凭证,必须做到标准化、规范化,要要素齐全、数字正确、字迹清晰、不错漏、不潦草,防止涂改。 一、 中文大写金额数字应用正楷或行书填写,如壹(壹)、贰(贰)、叁、肆(肆)、伍(伍)、陆(陆)、柒、捌、玖、拾、伯、仟、万(万)、亿、元、角、分、零、整(正)等字样。不得用一、二(两)、三、四、五、六、七、八、九、十、念、毛、另(或0)填写,不得自造简化字。如果金额数字书写中使用繁体字,也应受理。二、 中文大写金额数字到元为止的,在元之后,应写整(或正字,在角之后可以不写整(或正字。数字有分的,分后面不写整(或正字。 三、 中文大写金额数字前应标明人民币字样,大写金额数字应紧接人民币字样填写,不得留有空白。大写金额数字前未印人民币字样的,应加填人民币三字。在票据和结算凭证大写金额栏内不得预印固定的仟、佰、拾、万、仟、佰、拾、元、角、?quot;字样。四、阿拉伯小写金额数字中有0时,中文大写应按照汉语语言规律、金额数字构成和防止涂改的要求进行书写。举例如下:(一)阿拉伯数字中间有0时,中文大写金额要写零字。如¥1,40950,应写成人民币壹仟肆佰零玖元伍角。(二)阿拉伯数字中间连续有几个0时,中文大写金额中间可以只写一个零字。如¥6,00714,应写成人民币陆仟零柒元壹角肆分。(三)阿拉伯金额数字万位或元位是0,或者数字中间连续有几个0,万位、元位也是0,但千位、角位不是0时,中文大写金额中可以只写一个零字,也可以不写零字。如¥1,68032,应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分;又如¥107,00053,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。(四)阿拉伯金额数字角位是0,而分位不是0时,中文大写金额元后面应写零字。如¥16,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论