最近要用到字符串對齊,開始只是一部分字符串,就直接加空格了,后來發現有很多,
於是寫了個字符串對齊的函數。
--功能:分割字符串 --參數:帶分割字符串,分隔符 --返回:字符串表 function string.split(str, delimiter) str = tostring(str) delimiter = tostring(delimiter) if (delimiter=='') then return false end local pos,arr = 0, {} -- for each divider found for st,sp in function() return string.find(str, delimiter, pos, true) end do table.insert(arr, string.sub(str, pos, st - 1)) pos = sp + 1 end table.insert(arr, string.sub(str, pos)) return arr end --功能:統計字符串中字符的個數 --返回:總字符個數、英文字符數、中文字符數 function string.count(str) local tmpStr=str local _,sum=string.gsub(str,"[^\128-\193]","") local _,countEn=string.gsub(tmpStr,"[%z\1-\127]","") return sum,countEn,sum-countEn end --功能:計算字符串的寬度,這里一個中文等於兩個英文 function string.width(str) local _,en,cn=string.count(str) return cn*2+en end -- 功能: 把字符串擴展為長度為len,居中對齊, 其他地方以filledChar補齊 -- 參數: str 需要被擴展的字符、數字、字符串表,len 被擴展成的長度, -- filledChar填充字符,可以為空 function string.tocenter(str, len, filledChar) local function tocenter(str,len,filledChar) str = tostring(str); filledChar = filledChar or " "; local nRestLen = len - string.width(str); -- 剩余長度 local nNeedCharNum = math.floor(nRestLen / string.width(filledChar)); -- 需要的填充字符的數量 local nLeftCharNum = math.floor(nNeedCharNum / 2); -- 左邊需要的填充字符的數量 local nRightCharNum = nNeedCharNum - nLeftCharNum; -- 右邊需要的填充字符的數量 str = string.rep(filledChar, nLeftCharNum)..str..string.rep(filledChar, nRightCharNum); -- 補齊 return str end if type(str)=="number" or type(str)=="string" then if not string.find(tostring(str),"\n") then return tocenter(str,len,filledChar) else str=string.split(str,"\n") end end if type(str)=="table" then local tmpStr=tocenter(str[1],len,filledChar) for i=2,#str do tmpStr=tmpStr.."\n"..tocenter(str[i],len,filledChar) end return tmpStr end end -- 功能: 把字符串擴展為長度為len,左對齊, 其他地方用filledChar補齊 function string.toleft(str, len, filledChar) local function toleft(str, len, filledChar) str = tostring(str); filledChar = filledChar or " "; local nRestLen = len - string.width(str); -- 剩余長度 local nNeedCharNum = math.floor(nRestLen / string.width(filledChar)); -- 需要的填充字符的數量 str = str..string.rep(filledChar, nNeedCharNum); -- 補齊 return str; end if type(str)=="number" or type(str)=="string" then if not string.find(tostring(str),"\n") then return toleft(str,len,filledChar) else str=string.split(str,"\n") end end if type(str)=="table" then local tmpStr=toleft(str[1],len,filledChar) for i=2,#str do tmpStr=tmpStr.."\n"..toleft(str[i],len,filledChar) end return tmpStr end end -- 功能: 把字符串擴展為長度為len,右對齊, 其他地方用filledChar補齊 function string.toright(str, len, filledChar) local function toright(str, len, filledChar) str = tostring(str); filledChar = filledChar or " "; local nRestLen = len - string.width(str); -- 剩余長度 local nNeedCharNum = math.floor(nRestLen / string.width(filledChar)); -- 需要的填充字符的數量 str = string.rep(filledChar, nNeedCharNum).. str; -- 補齊 return str; end if type(str)=="number" or type(str)=="string" then if not string.find(tostring(str),"\n") then return toright(str,len,filledChar) else str=string.split(str,"\n") end end if type(str)=="table" then local tmpStr=toright(str[1],len,filledChar) for i=2,#str do tmpStr=tmpStr.."\n"..toright(str[i],len,filledChar) end return tmpStr end end --測試代碼 print("對齊測試\n") print(string.tocenter(string.split("居中cc\n居中","\n"),4*2,"*")) print(string.tocenter("居中cc\n居中",4*2)) print("\n") print(string.toright(string.split("居右rr\n居右","\n"),4*2,"*")) print(string.toright("居右rr\n居右",4*2)) print("\n") print(string.toleft(string.split("居左ll\n居左","\n"),4*2,"*")) print(string.toleft("居左ll\n居左",4*2))
另外附三個trim(刪除控制字符)函數
function string.ltrim(str) return string.gsub(str, "^[ \t\n\r]+", "") end function string.rtrim(str) return string.gsub(str, "[ \t\n\r]+$", "") end function string.trim(str) str = string.gsub(str, "^[ \t\n\r]+", "") return string.gsub(str, "[ \t\n\r]+$", "") end
其中,string.split、及三個trim均取自quick-cocos2d-x中的functions.lua,
三個對齊函數,修改自網上,以支持中文、字符串表、換行的字符串。
