schangxiang@126.com
2025-04-01 afc3ef31921d5ca812f7db92dfb107e2c25eff4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// 打印机纸宽58mm,页的宽度384,字符宽度为1,每行最多盛放32个字符
const PAGE_WIDTH = 384;
const MAX_CHAR_COUNT_EACH_LINE = 32;
 
/**
 * @param str
 * @returns {boolean} str是否全是中文
 */
function isChinese(str) {
    return /^[\u4e00-\u9fa5]$/.test(str);
}
 
/**
 * 返回字符串宽度(1个中文=2个英文字符)
 * @param str
 * @returns {number}
 */
function getStringWidth(str) {
    let width = 0;
    for (let i = 0, len = str.length; i < len; i++) {
        width += isChinese(str.charAt(i)) ? 2 : 1;
    }
    return width;
}
 
/**
 * 同一行输出str1, str2,str1居左, str2居右
 * @param {string} str1 内容1
 * @param {string} str2 内容2
 * @param {number} fontWidth 字符宽度 1/2
 * @param {string} fillWith str1 str2之间的填充字符
 *
 */
function inline(str1, str2, fillWith = ' ', fontWidth = 1) {
    const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
    // 需要填充的字符数量
    let fillCount = lineWidth - (getStringWidth(str1) + getStringWidth(str2)) % lineWidth;
    let fillStr = new Array(fillCount).fill(fillWith.charAt(0)).join('');
    return str1 + fillStr + str2;
}
 
/**
 * 用字符填充一整行
 * @param {string} fillWith 填充字符
 * @param {number} fontWidth 字符宽度 1/2
 */
function fillLine(fillWith = '-', fontWidth = 1) {
    const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
    return new Array(lineWidth).fill(fillWith.charAt(0)).join('');
}
 
/**
 * 文字内容居中,左右用字符填充
 * @param {string} str 文字内容
 * @param {number} fontWidth 字符宽度 1/2
 * @param {string} fillWith str1 str2之间的填充字符
 */
function fillAround(str, fillWith = '-', fontWidth = 1) {
    const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
    let strWidth = getStringWidth(str);
    // 内容已经超过一行了,没必要填充
    if (strWidth >= lineWidth) {
        return str;
    }
    // 需要填充的字符数量
    let fillCount = lineWidth - strWidth;
    // 左侧填充的字符数量
    let leftCount = Math.round(fillCount / 2);
    // 两侧的填充字符,需要考虑左边需要填充,右边不需要填充的情况
    let fillStr = new Array(leftCount).fill(fillWith.charAt(0)).join('');
    return fillStr + str + fillStr.substr(0, fillCount - leftCount);
}
 
// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
    const hexArr = Array.prototype.map.call(
        new Uint8Array(buffer),
        function(bit) {
            return ('00' + bit.toString(16)).slice(-2)
        }
    )
    return hexArr.join(',')
}
 
 
module.exports = {
    inline: inline,
    fillLine: fillLine,
    fillAround: fillAround,
    ab2hex:ab2hex,
};