当前位置: 首页 > news >正文

lua字符串对齐函数

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

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

--功能:分割字符串
--参数:带分割字符串,分隔符
--返回:字符串表
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,

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

相关文章:

  • 解决myeclipse10.x的Servers产生的NullPointerException
  • create database xx 或者show database 没有任何反应
  • Javascript模版引擎简介
  • paip.不同目录结构哈的文件批量比较
  • RHEL 5.x 平台 10G RAC 的快速安装脚本
  • 便捷的 chrome/Firefox扩展
  • mysql的datetime类型字段的区间查询
  • RGBA是什么
  • 模块化编程
  • ffmpeg编译
  • windows上安装Django
  • 故障原因:由于exchange服务器设置自动更新服务器重启后登陆owa报错http 500错误...
  • My name Hunk
  • 在VIM中添加一键编译和一键运行
  • baidumap demo(二)
  • Angularjs之国际化
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • co模块的前端实现
  • CSS居中完全指南——构建CSS居中决策树
  • CSS中外联样式表代表的含义
  • FastReport在线报表设计器工作原理
  • Laravel Mix运行时关于es2015报错解决方案
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • PHP变量
  • Python打包系统简单入门
  • react-native 安卓真机环境搭建
  • Redux 中间件分析
  • Twitter赢在开放,三年创造奇迹
  • vuex 笔记整理
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 离散点最小(凸)包围边界查找
  • 普通函数和构造函数的区别
  • 前端之Sass/Scss实战笔记
  • 微信公众号开发小记——5.python微信红包
  • 用jQuery怎么做到前后端分离
  • 正则与JS中的正则
  • 字符串匹配基础上
  • 积累各种好的链接
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • #QT(串口助手-界面)
  • (pytorch进阶之路)扩散概率模型
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)计算机毕业设计高校学生选课系统
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (转载)(官方)UE4--图像编程----着色器开发
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net refrector
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET微信公众号开发-2.0创建自定义菜单
  • .NET委托:一个关于C#的睡前故事
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /etc/motd and /etc/issue
  • /etc/skel 目录作用