我们点餐小程序有这样的一个功能,客人下订单时,后厨的小票打印机自动打印小票。这里小票打印机的排版不像表格那么容易,需要计算每行的字符数,程序通过增加空格来实现排版对齐的目标。
因为中文和英文占位宽度不一,中文占用空间是英文的两倍。因此在处理的时候,需要计算字符的长度后再处理。
常用的小票打印机有两种,分别是58mm 和80mm的,58mm的机器,一行打印16个汉字,32个字母;80mm的机器,一行打印24个汉字,48个字母
废话不多说,我们看一下最终要实现的排版效果图:
看一下打印内容的代码:
String prcontent = "
";
prcontent += "名称 单价 数量 金额
";
prcontent += "--------------------------------
";
prcontent += formStr("产品名","10.00","1","10.00");
prcontent += "备注:***
";
prcontent += "--------------------------------
";
prcontent += "合计:11元
";
prcontent += "联系电话:***
";
prcontent += "订餐时间:***
";
上面是一段标准的打印小票的代码,每一行的内容调用方法formStr来格式化(自动换行,列对齐)排版。
/**
* 格式化内容(58mm的机器,一行打印16个汉字,32个字母;80mm的机器,一行打印24个汉字,48个字母)这里按58mm处理的,如果是80的机器可以参考修改
* @param tit 名称 6字母||12英文
* @param fee 单价 6个英文
* @param n 数量 4个英文
* @param total 总计 6个英文
* @return
*/
public String formStr(String tit,String fee,String n,String total){
String ret="";
if(ret==null){
return "";
}
String title=tit;
int strlen=0;
try{
strlen=title.getBytes("GBK").length;
} catch (UnsupportedEncodingException ex) {
}
int tnum=6;
int titlen= tnum*2;//标题12字母
String otherStr =addSpace(fee,6) + addSpace(n,4)+ addSpace(total,6);
if(strlen<=titlen){//不够12列的补齐
ret=padStr(title,titlen)+otherStr+"
";
}else{//超过12列的要换行
int sizes=(title.length()-1+ tnum)/ tnum;
for(int m=0;m String childStr = substring(title, m * tnum, (m + 1) * tnum); if(m==0){//第一行 ret=childStr+otherStr+" }else{ ret+=childStr+" } } } return ret; } /** *字符串截取 */ public static String substring(String str, int f, int t) { if (f > str.length()) return null; if (t > str.length()) { return str.substring(f, str.length()); } else { return str.substring(f, t); } } /** *英文字符串的处理方法,不够长度补空格 */ public static String addSpace(String s, int size) { String str=s; int len = str.length(); if (len < size) { for (int i = 0; i < size - len; i++) { str += " "; } } return str; } /** *带中、英文字符串的处理方法,中文补两空格,英文补一空格 */ public String padStr(String s,int n){ String ret=""; String title=s; int strlen=0; try{ strlen=title.getBytes("GBK").length; } catch (UnsupportedEncodingException ex) { } if(strlen<=n){//不够列的补齐 int spacenum=n-strlen; for(int i=1;i<=spacenum;i++){ title+=" "; } } ret=title; return ret; } 好了,上面的几个方法可以集成到你的工具类里,使用时直接调用即可。 最后说一下实现原理: 1、定义好每一列的宽度 2、计算每一列字符长度(中文按2倍数) 3、如果不够长,那么调用padStr,addSpace方法,补充空格 4、如果长度超了,那么按指定长度分割成多行,遍历每一行排版 最后看一下点餐小程序: 直接看效果图吧。 门店管理端 前端用户点餐页面
";
";
标签: String
②文章观点仅代表原作者本人不代表本站立场,并不完全代表本站赞同其观点和对其真实性负责。
③文章版权归原作者所有,部分转载文章仅为传播更多信息、受益服务用户之目的,如信息标记有误,请联系站长修正。
④本站一律禁止以任何方式发布或转载任何违法违规的相关信息,如发现本站上有涉嫌侵权/违规及任何不妥的内容,请第一时间反馈。发送邮件到 88667178@qq.com,经核实立即修正或删除。