文档介绍:前言银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据, 直接关系到支付结算的准确、及时和安全。票据和结算凭证是银行、单位和个人凭以记载帐务的会计凭证, 是记载经济业务和明确经济责任的一种书面证明。因此, 填写票据和结算凭证, 必须做到标准化、规范化, 要要素齐全、数字正确、字迹清晰、不错漏、不潦草, 防止涂改。我的服务需要一个金额转换过程, 本来想在网上找, 但都是 C++ 、 JavaScript 、 Delph i 的 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 源字符串的格式错误,返回 NULL 8.*-非 NULL 目的字符串的首地址 9.* ***@note 转换根据:中国人民银行会计司编写的最新《企业、银行正确办理支付结算 10. * 指南》的第 114 页-第 115 页 11. */ 12. char* chineseFee( char* dest, char* src ) 13. { 14. enum 15. { 16. START, // 开始 17. MINUS, // 负号 18. ZEROINT, //0 整数 19. INTEGER, // 整数 20. DECIMAL, // 小数点 21. DECIMALfRACTION, // 小数位 22. END, // 结束 23. ERROR // 错误 24. } status = START; 25. struct 26. { 27. int minus; //0 为正, 1 为负 28. int sizeInt; 29. int sizeDecimal; 30. int integer[10]; 31. int decimal[10]; 32. } feeInfo; 33. char* NumberChar[] = 34. {"零","壹","贰","