跳至主要內容

水晶报表数字转大写

五六零网校大约 3 分钟

数字金额转大写

  1. 新增公式字段, 填入以下公式

说明,替换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); // 负数金额

效果: alt text