关于数据打印的详细探讨:如何才能打印得更整齐
一、话题引入
打印时一般有两种方式来使输出整齐规范,一个是限制位宽%-8s这样的,另一种使用制表符\t。
由于制表符\t是根据其前输出来补位的,而实际打印时数据长度往往不一,无法打印整齐。
制表符的补位规则
上网查询的话会发现都是说8位,但实际测试发现是4位,4n-3 到4n-1补到4n,4n到4n+3补到4(n+1)。(n是自然数).
制表符将输出区分成4格4格的区域,而\t就是跳到下一个4格开始的地方。
而使用限制位宽的方式又有如下的问题
我们发现都是限制位宽为4,两者打印宽度根本不一样,并且两者的宽度都不是4格。原因可以想到应该是中文也被认为是一个位宽但是实际宽度却不是一个空格导致的。
两者均不能得到我们想要的输出效果,所以到底要怎样输出整齐呢?
二、问题解决
经过尝试,发现限制位宽后接一个制表符,中文的位宽跟实际宽度好像就对应起来了,可以认为是位宽按照实际宽度计算。
两者打印整齐了,并且正好是8格空格。
但这只解决了位宽的问题,灵活的制表符是我们打印时要考虑的另一个问题
中国和意大利都超过了3格,而限制位宽当打印超过限制的会按照实际宽度打印,所以意大利5格\t就补到8格,但是中国就很奇怪,中国只有3格多一点点,加\t却补到了8格,难道是3格多一点点被认为是4格?
我们接着测试
这次将位宽限制至2,意大利仍然没问题,但我们却发现中国\t变成了4格(严格的4格,不多不少),那么上面3格多一点点被认为是4格的猜测是错误的。
那么另一种可能是3格加制表符\t补到8格(我以前就是这么认为的,网上都是说8位的规则),但这与我们最开始对制表符规则实践得到的结果不符(知道为什么我说灵活的制表符了吧(+_+) )
接着再尝试修改限制位宽数
又出现了一个预料之外的情况,按照位宽和制表符规则,意大利应该是8格啊,这里却是12格。(%-5s时还是8格)
接着改成7,结果连中国都变成了12格。
如果接着测试,8,9都是12格,到10时,意大利变成了16格。11时中国也变成了16格。
到这里我仍然看不出来这到底是遵循了什么规则,但至少可以证明使用\t后位宽计算按照实际宽度是错误的。
也就是说位宽计算时中文仍然被认为是一个位宽。
那么出现上面这些情况就可以解释了。
%-2s时,中国刚好是两个位宽,不补,然后制表符按照中国实际宽度补,3格多一点会补到4格;意大利超过了两个位宽按照实际宽度打印,不会补格数,制表符按照5格来补,补到8格。
%-3时,中国算两个,那么需要补1个空格,中国实际宽度是3格多一点点,那么加上空格是4格多一点点,那么制表符就补到8格。意大利跟%-2s时情况一样。
注意到意大利实际5格,那么补3格将到8格,因此%-6s时限制位宽补3格,制表符补到12格。而%-7s时中国加上5个空格也到达了8格多,补到12格。
三、总结
最后也没找到完美解决的方法,但限制位宽加制表符是相对来说比较整齐的方法。实际上我想了一个方案,就是根据实际宽度不同来补不同数目\t。那么我需要找一个能够计算字符串打印长度的方法。这涉及到图形界面的知识,如果我们学到了图形界面,肯定不再使用控制台输出,而且图形绘制里可以指定坐标打印,还能控制字体大小,所以找一个计算控制台字符串打印长度的方法意义不大。(我寻找了但是没找到,实在没办法就放弃了)
关于数据打印的详细探讨:如何才能打印得更整齐相关推荐
- 共享打印机HP1022在客户端打印的时重启打印服务器才能打印
声明:博客内所有技术性文章都是由作者本人工作经验的总结, 实现过程中有搜索资料为参考的绝不涉嫌抄袭,均为个人习惯的总结 今天公司的共享打印机不工作了,删除队列时其余的可以正常取消,但是状态为正在打印的 ...
- 打印机共享后,要主机打印一张其他电脑才能打印
1 客户端添加localport端口,方法如下: 点击开始-控制面板–打印机–添加打印机-添加本地打印机-–创建新端口-local port端口--\\主机的ip地址\共享名称--下一步选择从磁盘安装 ...
- 计算机怎么打印订单,微信小商店怎么打印订单小票、标签、发货单、电子面单?...
微信小商店是微信官方推出的一款免费的商城小程序,但是功能不是特别丰富,例如无法自动打印新订单.因为对于很多餐饮.零售.配送等商家来说,能自动打印新订单将免去商家查看手机.电脑,并且便于配货送货等.还有 ...
- Android底层隐私数据,Android Intent传递数据底层分析详细介绍_Android_脚本之家
Android Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...
- android中intent放数据类型,Android Intent传递数据底层分析详细介绍
Android Intent传递数据底层分析详细介绍 我们知道在Activity切换时,如果需要向下一个ActivityB传递数据,可以借助Intent对象的putExtra方法. 但是不知各位有没 ...
- 大数据分析学习的详细解读
以大数据分析师为目标,从数据分析基础.JAVA语言入门和linux操作系统入门知识学起,系统介绍Hadoop.HDFS.MapReduce和Hbase等理论知识和hadoop的生态环境. 一.大数据分 ...
- 【MockJS】使用MockJS模拟数据 (超级详细)
[MockJS]使用MockJS模拟数据 (超级详细) 文章目录 [MockJS]使用MockJS模拟数据 (超级详细) 2. MockJS 2.1 准备工作 2.2 语法规范 数据模板定义规范 DT ...
- 企业级指标数据体系建设思路探讨
企业级指标数据体系建设思路探讨 一.企业指标数据管理常遇到的挑战 1.1术语和定义 1.2挑战与痛点 二.设计目的 三.设计思路 3.1指标体系框架设计原则 3.2指标体系框架设计原理 四.指标选取原 ...
- ios 打印 详细错误日志_iOS中打印系统详细日志
Q:如何打印当前的函数和行号? A:我们可以在打印时使用一些预编译宏作为打印参数,来打印当前的函数和行号.如: 1 NSLog(@"%s:%d obj=%@", __func__, ...
- log4j怎样配置才能打印出执行语句所在的类名及行号
0 15 如题 比如 03:23:53,937 INFO LoginAction.java:25 - select ...... Struts 添加评论 关注(0) 2个答案按时间排序按投票排序 ...
最新文章
- 以 27K 成功入职字节跳动,这份《 软件测试面试笔记》让我受益终身...
- 基于python和postgreSQL存储图片
- linux关于防火墙的一些知识
- python画旋转圆_Python使用PyQt界面库绘制不停旋转的圆控件
- 学习 | Spring Cloud Config 从入门到精通
- 沈向洋、王海峰候选中国工程院院士!计算机领域7位入围增选
- h5 video 手机 显示第一帧_【图像处理二】HDMI显示(一)
- python中datetime函数怎么获得当年年份_Python 日期和时间函数使用指南
- 基于RV1126平台imx291分析
- 西部数据移动硬盘真伪测试软件,如何查询西数移动硬盘的真伪
- .webp是什么文件?怎么打开这种文件
- 如何在线批量将Word转换为PDF格式
- PHPMYWIND 教程之 碎片数据的使用GetFragment()
- 知乎高赞!怎么自学 python,大概要多久?
- PHP:报错 strpos() expects parameter 1 to be string, integer given
- 一个中关村IT男的房奴心路(转载)
- HDMI/type-c一线通EDP驱动板|应用高清便携显示器支持2K/1080P
- rust future async/await
- DRAM BRANK
- 深度学习入门笔记(九):深度学习数据处理