1. 更新说明
- 添加与 “零圆整” 等价的预先判断 (
0 / 0. / 0.0 / 0.00 / . / .0 / .00)
- 修复了因使用函数
strdup 导致的内存泄漏
- 除去输入串多余的空白符(
空格 / Tab制表符)
2. 代码如下面所示
//=================================================================
// CPSTR: Copyright (c) 2020 By Abodu, All Rights Reserved.
// FNAME: arabToChinese.c
// AUTHR: abodu,abodu@qq.com
// CREAT: 2020-06-14 14:56:23
// ENCOD: UTF-8 Without BOM
// VERNO: 1.0.3
// LUPTS: 2021-10-21 22:18:50
//=================================================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
*** 阿拉伯数字表示的金额串转换成中文大写金额
*** 转换成功,则输出转换后的大写金额
*** 转换失败,则返回NULL
**/
char *arabToChinese(const char *aInput);
#define JINER_MAX_SIZE 1 << 5
#define CNFEE_MAX_SIZE 1 << 8
static char a_src[JINER_MAX_SIZE] = {0};
static char o_chn[CNFEE_MAX_SIZE] = {0};
static char *spo = o_chn;
char *CU_INT[] = {
"整", "圆", //
"拾", "佰", "仟", "萬", //
"拾", "佰", "仟", "億", //
"拾", "佰", "仟", "兆", //
"拾", "佰", "仟", "京", //
"拾", "佰", "仟", "垓" //
};
char *CU_DEC[] = {"负", "角", "份", "厘", "钱", "毫"};
char *CN[] = {"零", "壹", "贰", "叁", "肆", //
"伍", "陆", "柒", "捌", "玖"};
char *CZ_ERR[] = {
"[ERR]格式错误,负号(-)出现在金额串的不正确位置处",
"[ERR]格式错误,小数点(.)只能出现一次",
"[ERR]格式错误,除-0.XX和0.XX外,不允许出现前置零(0XXX)",
"[ERR]格式错误,输入的串内含有不属于十进制金额的其他字符",
};
static char *apd1(char *npr) {
int t = strlen(o_chn);
snprintf(o_chn + t, sizeof(o_chn) - t, "%s", npr);
return o_chn;
}
static char *apd2(char *N1, char *N2) { return apd1(N1), apd1(N2); }
/**
*** 删除字符串中所有的逗号和空格
**/
char *trim_casp_all(char *p) {
int i = 0, j = 0;
while (p[i]) {
if (p[i]