財務(wù)專用:阿拉伯數(shù)字轉(zhuǎn)中文大寫金額(支持小數(shù))
— 金額小寫數(shù)字 整數(shù)元 轉(zhuǎn)換 中文大寫
function? yuan_zh(szNum)
? ? —阿拉伯數(shù)字轉(zhuǎn)中文大寫
? ? 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] –//轉(zhuǎn)換為相應(yīng)的數(shù)字
? ? ? ? ? ? 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)
? ? ? ? — 開頭的 “一十” 轉(zhuǎn)成 “十” , 貼近人的讀法
? ? ? ? if szNum == hzNum[2]..hzUnit[2] then
? ? ? ? ? ? num = string.sub(num, 4, string.len(num))
? ? ? ? end
? ? ? ? return num
? ? end
? ? return removeZero(szChMoney)..”圓”
end
— 金額小數(shù)點 角、分轉(zhuǎn)換 中文大寫
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] –//轉(zhuǎn)換為相應(yīng)的數(shù)字
? ? ? ? ? ? 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
— 需要判斷,金額是否包含小數(shù)點,若 包含小數(shù)點,需要將小數(shù)點前 設(shè)置為:strYuan ; 小數(shù)點后 設(shè)置為:strJiaoFen
local strYuan,strJiaoFen,strDaxie,strOldjine
strOldjine = “104567096”? — 將來這個數(shù)字賦值的時候,小數(shù)點要保留2位,最好小數(shù)第二是0要處理一下
t = split(strOldjine, “.”)? ? ?— 將 124567.09 拆分為 124567 及 09 兩個字符串
— 給 金額 整數(shù)元 賦值; 給 金額 角分 賦值
local strY = t[1]
local strJ = t[2]
–小數(shù)點前整數(shù) 元(需獨立獲取)
strYuan = yuan_zh(strY)
— 金額 的小數(shù)點前的 大寫
strDaxie = strYuan
–strJ小數(shù)點后 角分 (需獨立獲取)
if strJ ~= nil then
? ? strJiaoFen = jiaofen_zh(strJ)
? ? — 完整大寫金額 拼接后完成
? ? strDaxie = strDaxie..strJiaoFen
end
— for i = 1 ,200 do
? ?print(strDaxie)
— end