产品手册 实施方案 用户案例 问题中心

财务专用:阿拉伯数字转中文大写金额(支持小数)

财务专用:阿拉伯数字转中文大写金额(支持小数)
— 金额小写数字 整数元 转换 中文大写
function  yuan_zh(szNum)
    —阿拉伯数字转中文大写
    local szChMoney = “”
    local iLen = 0
    local iNum = 0
    local iAddZero = 0
    local hzUnit = {“”, “拾”, “佰”, “仟”, “万”, “拾”, “佰”, “仟”, “亿”,”拾”, “佰”, “仟”, “万”, “十”, “百”, “千”}
    local hzNum = {“零”, “壹”, “贰”, “叁”, “肆”, “伍”, “陆”, “柒”, “捌”, “玖”}
    if nil == tonumber(szNum) then
        return tostring(szNum)
    end
    iLen =string.len(szNum)
    if iLen > 10 or iLen == 0 or tonumber(szNum) < 0 then
        return tostring(szNum)
    end
    for i = 1, iLen  do
        iNum = string.sub(szNum,i,i)
        if iNum == 0 and i ~= iLen then
            iAddZero = iAddZero + 1
        else
            if iAddZero > 0 then
            szChMoney = szChMoney..hzNum[1]
        end
            szChMoney = szChMoney..hzNum[iNum + 1] –//转换为相应的数字
            iAddZero = 0
        end
        if (iAddZero < 4) and (0 == (iLen – i) % 4 or 0 ~= tonumber(iNum)) then
            szChMoney = szChMoney..hzUnit[iLen-i+1]
        end
    end
    local function removeZero(num)
        –去掉末尾多余的 零
        num = tostring(num)
        local szLen = string.len(num)
        local zero_num = 0
        for i = szLen, 1, -3 do
            szNum = string.sub(num,i-2,i)
            if szNum == hzNum[1] then
                zero_num = zero_num + 1
            else
                break
            end
        end
        num = string.sub(num, 1,szLen – zero_num * 3)
        szNum = string.sub(num, 1,6)
        — 开头的 “一十” 转成 “十” , 贴近人的读法
        if szNum == hzNum[2]..hzUnit[2] then
            num = string.sub(num, 4, string.len(num))
        end
        return num
    end
    return removeZero(szChMoney)..”圆”
end
— 金额小数点 角、分转换 中文大写
function jiaofen_zh(szNum)
    local szChMoney = “”
    local iLen = 0
    local iNum = 0
    local iAddZero = 0
    local hzUnit = {“分”, “角”}
    local hzNum = {“零”, “壹”, “贰”, “叁”, “肆”, “伍”, “陆”, “柒”, “捌”, “玖”}
    if nil == tonumber(szNum) then
        return ‘请输入金额’
    end
    iLen =string.len(szNum)
    if iLen > 15 or iLen == 0 or tonumber(szNum) < 0 then
        return “请输入金额”
    end
    local i = 0
    for i = 1, iLen do
        iNum = string.sub(szNum,i,i)
        if iNum == 0 then
            iAddZero = iAddZero + 1
        else
            if iAddZero > 0 then
                szChMoney = szChMoney..hzNum[1]
            end
            szChMoney = szChMoney..hzNum[iNum + 1] –//转换为相应的数字
            iAddZero = 0
        end
        if iNum ~=0 or iLen-i==3 or iLen-i==11 or ((iLen-i+1)%8==0 and iAddZero<4) then
            szChMoney = szChMoney..hzUnit[iLen-i+1]
        end
    end
    return szChMoney
end
— 对字符串进行 拆分 ,目的是 将 1309.21 拆分为 1309 及 21 两个字符串
function split(str,delimiter)
    local dLen = string.len(delimiter)
    local newDeli = ”
    for i=1,dLen,1 do
        newDeli = newDeli .. “[“..string.sub(delimiter,i,i)..”]”
    end
    local locaStart,locaEnd = string.find(str,newDeli)
    local arr = {}
    local n = 1
    while locaStart ~= nil
    do
        if locaStart>0 then
            arr[n] = string.sub(str,1,locaStart-1)
            n = n + 1
        end
        str = string.sub(str,locaEnd+1,string.len(str))
        locaStart,locaEnd = string.find(str,newDeli)
    end
    if str ~= nil then
        arr[n] = str
    end
    return arr
end
— 需要判断,金额是否包含小数点,若 包含小数点,需要将小数点前 设置为:strYuan ; 小数点后 设置为:strJiaoFen
local strYuan,strJiaoFen,strDaxie,strOldjine
strOldjine = “104567096”  — 将来这个数字赋值的时候,小数点要保留2位,最好小数第二是0要处理一下
t = split(strOldjine, “.”)     — 将 124567.09 拆分为 124567 及 09 两个字符串
— 给 金额 整数元 赋值; 给 金额 角分 赋值
local strY = t[1]
local strJ = t[2]
–小数点前整数 元(需独立获取)
strYuan = yuan_zh(strY)
— 金额 的小数点前的 大写
strDaxie = strYuan
–strJ小数点后 角分 (需独立获取)
if strJ ~= nil then
    strJiaoFen = jiaofen_zh(strJ)
    — 完整大写金额 拼接后完成
    strDaxie = strDaxie..strJiaoFen
end
— for i = 1 ,200 do
   print(strDaxie)
— end
标签:手册方案脚本 上一篇: 下一篇:
展开更多
预约软件体验

loading...