如何实现收据字符串右对齐?现有代码对齐异常求助
解决字符串文本右对齐(价格对齐)的问题
看起来你现在的核心问题是价格部分无法稳定右对齐,根源在于格式化字符串的方式有误,以及对行长度的计算没有排除换行符的干扰。我来帮你调整代码,实现商品信息左对齐、价格整体右对齐的效果:
关键修正点
- 不要将累积的
DadosPedido直接传入String.Format,应该先单独构建当前行的左右部分,再格式化后追加到DadosPedido - 计算行长度时排除换行符
\n,避免影响总宽度的计算 - 使用更可靠的对齐语法,确保价格区域的宽度固定或动态适配总宽度
修改后的代码示例
主商品行的修正
// 构建当前行的左侧文本(不含价格) string leftPart = $"{Quantidade}x {item}"; // 价格文本(格式化后) string priceText = preco; // 总宽度固定为80,右侧价格区域预留足够宽度(比如12字符,适配货币格式) int totalWidth = 80; int priceAreaWidth = 12; int leftAreaWidth = totalWidth - priceAreaWidth; // 格式化:左侧左对齐占满leftAreaWidth,右侧右对齐占满priceAreaWidth string formattedLine = String.Format("{0,-" + leftAreaWidth + "}{1," + priceAreaWidth + "}\n", leftPart, priceText); // 将格式化后的行追加到DadosPedido DadosPedido += formattedLine;
附加商品行的修正
// 构建附加商品的左侧文本 string addonLeftPart = $" - {Qtd}x {Item}"; string addonPriceText = preco_addon; // 同样使用80总宽度,价格区域宽度保持一致(确保对齐) string formattedAddonLine = String.Format("{0,-" + leftAreaWidth + "}{1," + priceAreaWidth + "}\n", addonLeftPart, addonPriceText); DadosPedido += formattedAddonLine;
为什么原来的代码会失效?
- 错误的Format参数:你之前把
DadosPedido + ...作为{0}的内容,这会把之前累积的所有文本都当作当前行的左侧部分,导致Format无法正确计算当前行的对齐位置。 - 包含换行符的长度计算:你计算
qtdLinhaPedido时包含了\n,这会让qtd_pontos的计算值偏小,导致填充的空格不够,价格无法右对齐到正确位置。 - 动态宽度的不可靠性:通过
80 - qtdLinhaPedido计算价格区域宽度,会因为左侧文本长度不一导致价格的起始位置波动,固定价格区域宽度能确保所有价格对齐在同一竖线上。
如果需要更灵活的动态宽度(比如根据最长的左侧文本调整),可以先收集所有左侧文本,计算最大长度后再统一设置左侧区域宽度,但固定价格区域宽度在打印场景(比如80mm小票)会更稳定。
内容的提问来源于stack exchange,提问作者Matheus Arruda
相关产品推荐
相关产品推荐

