小票打印机的自动转行排版
编辑时间:2021-05-22 作者:金满斗 浏览量:2039 来源:原创

先上效果图吧。

转行空了一格,后来又改进了点,图就不贴了。


聚宝盆记账易小程序版要加蓝牙打印,别的倒简单,就是这个小票格式打来不好看,网上查了下只有java版的,我来搞个javascipt版吧。


关键的几个函数贴上来。

 //按英文长度分割成数组
 function mystrSubString (str,len,strtab=[]){
  let N = getBytesLength(str);
  if(N > len){
     let mystr =  formatStringLen(str,len);
     str = str.replace(mystr,"");  //替换掉已有的,相当于删除已截取的
     strtab.push(mystr);
     return mystrSubString(str,len,strtab);
  }else{
     let mystr =  formatStringLen(str,len);
     strtab.push(mystr);
     return strtab;
  }
 }


function getBytesLength(val) {
  var str = new String(val);
  var bytesCount = 0;
  for (var i = 0n = str.lengthi < ni++) {
    var c = str.charCodeAt(i);
    if ((c >= 0x0001 && c <= 0x007e) || (0xff60 <= c && c <= 0xff9f)) {
      bytesCount += 1;
    } else {
      bytesCount += 2;
    }
  }
  return bytesCount;
}



     //4列打印,销售单模版(名称,数量,单价,合计,字符最大长度,名称长度,数量长度,单价长度,合计长度)
function printFourData(goods_name,numgoods_pricetotal_price,maxLen = 46) {
    let sb = '';
    let name = "";
    let leftLength = (maxLen==32) ? 12 : 24 ;           //商品名称的宽窄
    maxLen = maxLen - leftLength;
    let leftText = num;
    let centerText = goods_price;
    let rightText = total_price;
    let leftTextLength = getBytesLength(leftText);
    let centerTextLength = getBytesLength(centerText);
    let rightTextLength = getBytesLength(rightText);
      let centspacelenght = maxLen - leftTextLength - rightTextLength;
    let spaceLeft = Math.floor((centspacelenght-centerTextLength)/2);   //空格不整除时,左边少一个,右边加一个,好对齐
    let spaceRight = Math.ceil((centspacelenght-centerTextLength)/2);
    //隔单位的空格重调下
    if(leftLength==22){
    spaceLeft = (spaceLeft > 8) ? 8 : spaceLeft
    }else{
    spaceLeft = (spaceLeft > 6) ? 6 : spaceLeft
    }
    if(spaceRight <= 0){     //右边的空格缺了就往左边挤一下
    spaceLeft = spaceLeft + spaceRight;
    spaceRight = 1 ;
    }
    if(spaceLeft <=0){
    leftLength = leftLength +spaceLeft ;
    }
    centerText =  "".padEnd(spaceLeft) + centerText + "".padEnd(spaceRight);
    sb = sb.concat(leftText,centerText,rightText,'\n') ;
    //注意,这还只是取了右边的,如果左边超宽,则自动转行
    let nameTextLength = getBytesLength(goods_name);
  
    if(leftLength >= nameTextLength){
      name = goods_name+"".padEnd(leftLength-nameTextLength);
      sb = name + sb;   
    }else{
       let stringtab = mystrSubString (goods_name,leftLength);
       for (let index = 0index < stringtab.lengthindex++) {
        name = stringtab[index];
        sb =(index==0)? (name + sb):(sb + name + '\n'); 
       }
    }
    return sb.toString();
}
  


调试

let str = "笔记本电源IC2589";

console.log(printFourData("商品名称","数量","单价",'合计',46));
 
console.log(printFourData(str,'1条','4500.00','4500.00',46));

console.log(printFourData("商品名称","数量","单价",'合计',32));
console.log(printFourData(str,'1','5.00','5.00',32));
console.log(printFourData("笔记本",'1对','5.00','5.00',32));

来说两句吧