<?php namespace Xpyun\util; class NoteFormatter { /** * 58mm 系列打印机模板 */ public const ROW_MAX_CHAR_LEN = 32; public const MAX_HEAD_NAME_CHAR_LEN58 = 116; private const MAX_NAME_CHAR_LEN = 20; private const LAST_ROW_MAX_NAME_CHAR_LEN = 16; private const MAX_QUANTITY_CHAR_LEN = 6; private const MAX_PRICE_CHAR_LEN = 6; /** * 80mm 系列打印机模板 */ public const ROW_MAX_CHAR_LEN80 = 48; public const MAX_HEAD_NAME_CHAR_LEN80 = 32; private const MAX_NAME_CHAR_LEN80 = 36; // 每行打印的字符数,汉字,字母,数字均为1 private const LAST_ROW_MAX_NAME_CHAR_LEN80 = 17; private const MAX_QUANTITY_CHAR_LEN80 = 6; private const MAX_PRICE_CHAR_LEN80 = 6; public static function formatPrintOrderItem80($foodName, $quantity, $price) { $foodNameLen = Encoding::CalcGbkLenForPrint($foodName); $mod = $foodNameLen % self::ROW_MAX_CHAR_LEN80; $result = ""; if ($foodNameLen <= self::LAST_ROW_MAX_NAME_CHAR_LEN80 * 2) { $result = $foodName; $result = $result . str_repeat(" ", self::MAX_NAME_CHAR_LEN80 - $mod); $quantityStr = '' . $quantity; $quantityLen = Encoding::CalcAsciiLenForPrint($quantityStr); $priceStr = '' . round($price, 2); $priceLen = Encoding::CalcAsciiLenForPrint($priceStr); $result = $result . $quantityStr . str_repeat(" ", self::MAX_QUANTITY_CHAR_LEN80 - $quantityLen); $result = $result . $priceStr . str_repeat(" ", self::MAX_PRICE_CHAR_LEN80 - $priceLen); } else { $result = $result . self::getFoodNameSplit80($foodName, $quantity, $price); $result = mb_convert_encoding($result, "UTF-8"); } return $result . "<BR>"; } private static function getFoodNameSplit80($foodName, $quantity, $price): string { print_r($foodName); $foodNames = str_split($foodName, self::LAST_ROW_MAX_NAME_CHAR_LEN80 * 3); $resultTemp = ""; for ($i = 0; $i < count($foodNames); $i++) { $foodNameTmp = $foodNames[$i]; if ($i == 0) { $foodNameLen = Encoding::CalcGbkLenForPrint($foodNameTmp); $mod = $foodNameLen % self::ROW_MAX_CHAR_LEN80; $resultTemp = $resultTemp . $foodNameTmp; $resultTemp = $resultTemp . str_repeat(" ", self::MAX_NAME_CHAR_LEN80 - $mod); $quantityStr = '' . $quantity; $quantityLen = Encoding::CalcAsciiLenForPrint($quantityStr); $priceStr = '' . round($price, 2); $priceLen = Encoding::CalcAsciiLenForPrint($priceStr); $resultTemp = $resultTemp . $quantityStr . str_repeat(" ", self::MAX_QUANTITY_CHAR_LEN80 - $quantityLen); $resultTemp = $resultTemp . $priceStr . str_repeat(" ", self::MAX_PRICE_CHAR_LEN80 - $priceLen); } else { $resultTemp = $resultTemp . $foodNameTmp . "<BR>"; } } return $resultTemp; } /** * 格式化菜品列表(用于58mm打印机) * 注意:默认字体排版,若是字体宽度倍大后不适用 * 58mm打印机一行可打印32个字符 汉子按照2个字符算 * 分3列: 名称20字符一般用16字符4空格填充 数量6字符 单价6字符,不足用英文空格填充 名称过长换行 * * @param foodName 菜品名称 * @param quantity 数量 * @param price 价格 * @throws Exception */ public static function formatPrintOrderItem($foodName, $quantity, $price) { $orderNameEmpty = str_repeat(" ", self::MAX_NAME_CHAR_LEN); $foodNameLen = Encoding::CalcGbkLenForPrint($foodName); // print("foodNameLen=".$foodNameLen."\n"); $quantityStr = '' . $quantity; $quantityLen = Encoding::CalcAsciiLenForPrint($quantityStr); // print("quantityLen=".$quantityLen."\n"); $priceStr = '' . round($price, 2); $priceLen = Encoding::CalcAsciiLenForPrint($priceStr); // print("priceLen=".$priceLen); $result = $foodName; $mod = $foodNameLen % self::ROW_MAX_CHAR_LEN; // print("mod=".$mod."\n"); if ($mod <= self::LAST_ROW_MAX_NAME_CHAR_LEN) { // 保证各个列的宽度固定,不足部分,利用空格填充 //make sure all the column length fixed, fill with space if not enough $result = $result . str_repeat(" ", self::MAX_NAME_CHAR_LEN - $mod); } else { // 另起新行 // new line $result = $result . "<BR>"; $result = $result . $orderNameEmpty; } $result = $result . $quantityStr . str_repeat(" ", self::MAX_QUANTITY_CHAR_LEN - $quantityLen); $result = $result . $priceStr . str_repeat(" ", self::MAX_PRICE_CHAR_LEN - $priceLen); $result = $result . "<BR>"; return $result; } } ?>