财务专用:阿拉伯数字转中文大写金额(支持小数)
— 金额小写数字 整数元 转换 中文大写
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
上一篇: 数据对象的编号生成
下一篇: 项目合同管理的重要性