最近要用到字符串对齐,开始只是一部分字符串,就直接加空格了,后来发现有很多,

于是写了个字符串对齐的函数。

--功能:分割字符串
--参数:带分割字符串,分隔符
--返回:字符串表
function string.split(str, delimiter)
str = tostring(str)
delimiter = tostring(delimiter)
if (delimiter=='') then return false end
local pos,arr = , {}
-- 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 - ))
pos = sp +
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*+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 / ); -- 左边需要的填充字符的数量
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[],len,filledChar)
for i=,#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[],len,filledChar)
for i=,#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[],len,filledChar)
for i=,#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"),*,"*"))
print(string.tocenter("居中cc\n居中",*))
print("\n")
print(string.toright(string.split("居右rr\n居右","\n"),*,"*"))
print(string.toright("居右rr\n居右",*))
print("\n")
print(string.toleft(string.split("居左ll\n居左","\n"),*,"*"))
print(string.toleft("居左ll\n居左",*))

另外附三个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,

三个对齐函数,修改自网上,以支持中文、字符串表、换行的字符串。

lua字符串对齐函数的更多相关文章

  1. lua字符串分割函数[适配中文特殊符号混合]

    lua的官方函数里无字符串分割,起初写了个简单的,随之发现如果是中文.字符串.特殊符号就会出现分割错误的情况,所以就有了这个zsplit. function zsplit(strn, chars) f ...

  2. Lua 字符串查找函数 string.find(s, pattern [, init [, plain]] )【转】

    函数原型 string.find(s, pattern [, init [, plain]] ) s: 源字符串 pattern: 待搜索模式串 init: 可选, 起始位置 plain: 我没用过 ...

  3. Lua字符串库(整理)

    Lua字符串库小集 1. 基础字符串函数:    字符串库中有一些函数非常简单,如:    1). string.len(s) 返回字符串s的长度:    2). string.rep(s,n) 返回 ...

  4. 飘逸的python - 增强的格式化字符串format函数

    自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱. 语法 它通过{}和 ...

  5. lua二进制操作函数

    由于 Lua 脚本语言本身不支持对数字的二进制操作(例如 与,或,非 等操作),MUSHclient 为此提供了一套专门用于二进制操作的函数,它们都定义在一个“bit”表中,使用时只要requre “ ...

  6. Python内置的字符串处理函数整理

    Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 ...

  7. 《Python CookBook2》 第一章 文本 - 测试一个对象是否是类字符串 && 字符串对齐

    测试一个对象是否是类字符串 任务 有时候需要测试一个对象,尤其是当你在写一个函数或者方法的时候,经常需要测试传入的参数是否是一个字符串. 解决方案 利用内建的isinstance 和basestrin ...

  8. Python 的格式化字符串format函数

    阅读mattkang在csdn中的博客<飘逸的python - 增强的格式化字符串format函数>所做笔记 自从python2.6开始,新增了一种格式化字符串的函数str.format( ...

  9. 强大的字符串格式化函数 - format

    自python2.6开始,新增了一种格式化字符串的函数str.format(),它通过{}和:来代替% 位置方法格式化 >>>'{}-{}'.format('simon','ting ...

随机推荐

  1. 数据库插入数据返回当前自增主键ID值的方法

    当我们插入一条数据的时候,我们很多时候都想立刻获取当前插入的主键值返回以做它用.我们通常的做法有如下几种: 1. 先 select max(id) +1 ,然后将+1后的值作为主键插入数据库: 2. ...

  2. hadoop压缩框架

    一般来说,计算机处理的数据都存在一些冗余度,同时数据中间,尤其是相邻数据间存在着相关性,所以可以通过一些有别于原始编码的特殊编码方式来保存数据,使数据占用的存储空间比较小,这个过程一般叫压缩.和压缩对 ...

  3. [AngularJS] Angular 1.3 Anuglar hint

    Read More: http://www.linkplugapp.com/a/953215 https://docs.google.com/document/d/1XXMvReO8-Awi1EZXA ...

  4. 求证:a^4+b^4 ≧a^3*b+a*b^3

    证明: a4+b4-a3b-ab3 =a3(a-b)-b3(a-b) =(a3-b3)(a-b) =(a-b)2(a2+ab+b2) 而a2+ab+b2=a2+ab+b2/4+3b2/4=(a+b/2 ...

  5. Drag & drop a button widget

    In the following example, we will demonstrate how to drag & drop a button widget. #!/usr/bin/pyt ...

  6. Python continue

    continue继续循环在循环过程中,可以用break退出当前循环,还可以用continue跳过后续循环代码,继续下一次循环.假设我们已经写好了利用for循环计算平均分的代码: L = [75, 98 ...

  7. 【转发】未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序。

     http://www.cnblogs.com/joey0210/archive/2012/09/29/2708420.html   上一篇文章说到了DLL引用问题,主要是说的程序中如果使用过了反射, ...

  8. adb详解

    adb详解 分类: android开发工具相关 2012-10-24 18:27 2822人阅读 评论(0) 收藏 举报 ADB全称Android Debug Bridge,是android sdk里 ...

  9. spring 发送邮件问题

    public void sendEmail() throws Exception { JavaMailSenderImpl senderImpl = new JavaMailSenderImpl(); ...

  10. myeclipse2014安装jad反编译插件

    myeclipse上默认不能查看class文件,需要查看的话安装反编译插件 安装步骤: 准备图中框里的两个文件 1. [net.sf.jadclipse_3.3.0.jar]文件拷贝到如下路径([D: ...