水晶报表数字转大写
大约 3 分钟
数字金额转大写
- 新增公式字段, 填入以下公式
说明,替换
OPCH.DocTotalSy
字段为要转换的字段即可
// 说明:
// 本代码用于将文档总金额转换为中文大写格式。处理流程如下:
// 1. 将传入的金额转换为字符串,并去除逗号和小数点。
// 2. 从金额的末尾开始遍历每一位数字,将其转换为对应的中文大写数字。
// 3. 根据金额位数,添加相应的中文单位(如"亿"、"仟"、"佰"等)。
// 4. 清理多余的"0",确保格式正确。
// 5. 将阿拉伯数字替换为中文大写数字(如“壹”、“贰”、“叁”等)。
// 6. 根据金额的正负,决定输出的格式。负数金额会在输出中加上“负”字。
// 只需在代码开头设置一次金额字段值,代码会自动处理并输出中文大写金额。
StringVar fieldValue; // 存储文档金额的字段值
StringVar x;
StringVar xx := "";
NumberVar z;
NumberVar i;
// 设置需要转换的文档总金额字段值
// 把{OPCH.DocTotalSy}替换为需要转换大写金额的字段
fieldValue := ToText({OPCH.DocTotalSy});
// 将文档总金额转换为文本格式,去除逗号和小数点,并计算字符串的长度
x := Replace(fieldValue, ",", "");
x := Replace(x, ".","");
z := length(x);
// 从后往前遍历每个数字,将其转换为中文大写格式
for i := z to 1 step -1 do
(
StringVar temp:=Mid(x,z-i+1,1);
select i
case 12 : xx := temp + "十"
case 11 : xx := xx + temp + "亿"
case 10 : xx := xx + temp + "仟"
case 9 : xx := xx + temp + "佰"
case 8 : xx := xx + temp + "拾"
case 7 : xx := xx + temp + "万"
case 6 : xx := xx + temp + "仟"
case 5 : xx := xx + temp + "佰"
case 4 : xx := xx + temp + "拾"
case 3 : xx := xx + temp + "元"
case 2 : xx := xx + temp + "角"
case 1 : xx := xx + temp + "分"
);
// 清理格式化后的金额字符串,去除不必要的零
stringvar test = "";
z := length(xx);
i := 1;
// 遍历格式化后的金额字符串,处理零的逻辑
while i < z do
(
StringVar temp := Mid(xx, i, 1);
if temp = "0" then
(
if mid(xx, i - 2, 1) <> "0" and (Mid(xx, i + 1, 1) = "亿" or Mid(xx, i + 1, 1) = "万" or Mid(xx, i + 1, 1) = "元") then
(
xx := Left(xx, i - 1) + Replace(xx, Mid(xx, i, 1), "", i, 1);
)
else if mid(xx, i - 2, 1) <> "0" and i + 2 < length(xx) and mid(xx, i + 2, 1) <> "0" then
(
xx := Left(xx, i) + Replace(xx, Mid(xx, i + 1, 1), "", i + 1, 1);
)
else if Mid(xx, i + 1, 1) = "角" and Mid(xx, i + 2, 1) <> "0" then
(
xx := Left(xx, i) + Replace(xx, Mid(xx, i + 1, 1), "", i + 1, 1);
)
else
(
i := i - 1;
xx := Left(xx, i) + Replace(xx, Mid(xx, i + 1, 2), "", i + 1, 1);
)
);
i := i + 1;
z := length(xx);
);
// 将数字替换为中文大写字,并添加“整”字
xx := Replace(xx, "0", "零");
xx := Replace(xx, "1", "壹");
xx := Replace(xx, "2", "贰");
xx := Replace(xx, "3", "叁");
xx := Replace(xx, "4", "肆");
xx := Replace(xx, "5", "伍");
xx := Replace(xx, "6", "陆");
xx := Replace(xx, "7", "柒");
xx := Replace(xx, "8", "捌");
xx := Replace(xx, "9", "玖");
xx := xx + "整" + test;
// 根据文档总金额是否大于零来格式化输出结果
if ToNumber(fieldValue) > 0 then
xx := '' + right(xx, length(xx) - 0) // 正数金额
else
xx := '-' + right(xx, length(xx) - 2); // 负数金额
效果: