大写金额用计算机简单些,小写金额转换为大写金额(C实现)
银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、及时和安全。票据和结算凭证是银行、单位和个人凭以记载帐务的会计凭证,是记载经济业务和明确经济责任的一种书面证明。因此,填写票据和结算凭证,必须做到标准化、规范化,要要素齐全、数字正确、字迹清晰、不错漏、不潦草,防止涂改。
我的服务需要一个金额转换过程,本来想在网上找,但都是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。
另外,转换的一个重点是大写金额的写法,好像大多的算法都注重转换过程而对这个问题没有深究。我在文章后面附上转换规则。
下面是代码
/**
* @brief 将源字符串中的小写金额转换为大写格式
*
* @param dest 目的字符串
* @param src 小写金额字符串
* @return
* - NULL 源字符串的格式错误,返回NULL
* - 非NULL 目的字符串的首地址
* @note 转换根据:中国人民银行会计司编写的最新《企业、银行正确办理支付结算
* 指南》的第114页-第115页
*/
char* chineseFee( char* dest, char* src )
{
enum
{
START, //开始
MINUS, //负号
ZEROINT, //0整数
INTEGER, //整数
DECIMAL, //小数点
DECIMALfRACTION, //小数位
END, //结束
ERROR //错误
} status = START;
struct
{
int minus; //0为正,1为负
int sizeInt;
int sizeDecimal;
int integer[10];
int decimal[10];
} feeInfo;
char* NumberChar[] =
{ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
char* UnitChar[] =
{ "整", "圆", "拾", "佰","仟", "万", "拾", "佰", "仟", "亿",
"拾", "佰", "仟", "万亿", "拾", "佰", "仟", "亿亿",
"角", "分", "负", "人民币" };
int i, j,size; //循环变量
int zeroTag = 0, //0标志
decZeroTag = 0;
char* pDest = dest;
char* pSrc = src;
int* pInt = feeInfo.integer;
int* pDec = feeInfo.decimal;
//初始化
feeInfo.sizeInt = 0;
feeInfo.sizeDecimal = 0;
feeInfo.minus = 0;
//分析字符串
while( 1 )
{
switch ( *pSrc )
{
case ‘-‘ :
status = ( status == START ) ? MINUS : ERROR;
feeInfo.minus = ( status == MINUS ) ? 1 : 0;
break;
case ‘1‘ :
case ‘2‘ :
case ‘3‘ :
case ‘4‘ :
case ‘5‘ :
case ‘6‘ :
case ‘7‘ :
case ‘8‘ :
case ‘9‘ :
case ‘0‘ :
大写金额用计算机简单些,小写金额转换为大写金额(C实现)相关推荐
- 人民币 小写金额转换为大写金额
人民币 小写金额转换为大写金额 标签(空格分隔): 人民币 小写金额转换为大写金额 jsp: div class="form-group"> <label class= ...
- 小写金额转换为大写金额JS方法
/** *function: 小写金额转换为大写金额 *return: 转换后的大写金额,类型String */ function money2Cn(str){ var temp = parse ...
- 将小写金额转换为大写金额
/* 运行环境:MS-SQL 2000 将小写金额转换为大写金额 整数部分最大值:9位数 小数部分最大值:2位 必须格式:整数.小数 状态:完成 Update date:2007-10-07 */ / ...
- 大写金额用计算机简单些,Excel如何将较小的金额转换为大写金额?
如图所示,只要输入小写数字,相应的大写字母就会出现. 你可以知道你读了多少书. 容易吗? 具体解决方法如下: 简单,我们可以自定义条件格式,效果几乎是不可能的:使用公式提取更为完美. 公式如下: = ...
- c语言字符串大写金额,小写金额转换为大写金额(C实现)
零", "壹", "贰", "叁", "肆", "伍", "陆", & ...
- oracle人民币转大写,Oracle 小写金额转换为大写
在开发EBS的合同报表打印的时候需要将小写金额转换为大写. 如下是本人自己写的转换函数. 主要思路:先获取小数点位置,在区分整数与小数点处理,根据位数和数字组合读取金额. 最后再处理特殊显示部分. / ...
- JQuery 数字金额转换为大写金额
web JQuery 数字金额转换为大写金额 网址:https://blog.csdn.net/qq_36894527/article/details/80675658 function Arabia ...
- 人民币小写金额转大写金额
#region 人民币小写金额转大写金额/// <summary>/// 小写金额转大写金额/// </summary>/// <param name="Mon ...
- JS人民币小写金额转换为大写(没毛病)
/** * 人民币小写金额转换为大写 */ export const digitUppercase = (n) => {let fraction = ['角', '分'] let digit = ...
- #小写金额转大写金额
小写金额转大写金额 闲话不多说,直接上代码: function num_to_rmb($num){ $c1 = "零壹贰叁肆伍陆柒捌玖";$c2 = "分角元拾佰仟万拾佰 ...
最新文章
- XFCE字体发虚的解决方法
- Android 智能问答机器人的实现
- Linux 进程内 全局看见,Android获得全局进程信息以及进程使用的内存情况
- goudp文件传输服务器,golang udp服务端客户端例子
- 【JOURNAL】好久了啊
- 水滴石穿C语言之可变参数问题
- springboot10-springcloud-eureka 服务注册与发现,负载均衡客户端(ribbon,feign)调用
- springboot跨域处理
- U2000北向 CORBA客户端代码Java编程示例
- html 项目考勤展示页面,打卡页面.html
- 如何判断 Oracle RAC 中的 Master 主节点
- 基于MapGIS的GIS二次开发作业文档
- python调用openapi_eleme.openapi.python.sdk · PyPI
- Cesium 修改鼠标样式
- CSDN没有适配竖屏显示器(3840x2160)
- 服务器减少一半,TDengine在华自科技的落地实践
- 象棋软件可击败所有大师 人机结合或是新方向
- Linux基础命令---文本过滤coi
- 2021年中国地图省市县区边界shp格式arcgis数据(预览图)
- Java面向对象设计模式