目录
一、C中格式化输出
1. 进制转换符号
以上符号以%(引导符)开头,字母一般写在格式化转换说明的结尾,例如:%3.2f(这里的3.2后续会讲解)。
2. 转换修饰符
笔者在吸取前辈的经验后,总结了一个方便记忆的表格:
#include <stdio.h>
void main(void)
{
int a_int = -12;
unsigned int a_uint = 12;
float b_float = 3.123456789;
double b_double = 3.1234567890123456789;
long double b_ldouble = 3.1234567890123456789;
unsigned char c = 0xFF;
printf("\n");
printf(" a_int格式化结果: %-10.5d\n", a_int); //左对齐、10位宽、最小显示5位
printf(" a_uint格式化结果: %010u\n", a_uint); //10位宽、0填充
printf(" b_float格式化结果: %.10f\n", b_float); //保留小数10位,有效小数位 7位
printf(" b_double格式化结果:%.20f\n", b_double); //保留小数20位,有效小数位16位
printf(" 0xFF格式化结果: %#X\n", c); //十六进制显示,加上0X前缀
getchar(); //防止调试窗口一闪而过
}
运行结果:
3. 特殊情况
(1) Q:如果转换说明中的数据类型符号和传入的变量类型不同会如何?(见下方代码)
A:当类型不一致时并不会进行类型转换,而是直接传入,造成的结果就是打印的不是我们所传入的值。
(2) Q:如果前方有两个%,而后面只传入一个变量会如何?(见下方代码)
A:第二个%格式化,内存中传入变量后面存储的值,这个值是什么我们不得而知。
void main(void)
{
unsigned char c_char = 'A';
int a_int = 12;
float b_float = 3.14;
printf("\n");
printf(" c_char格式化结果: %d\n", c_char); //A 对应的ASCII码值是65
printf(" a_int格式化结果: %f\n", a_int);
printf(" b_float格式化结果: %d,%f\n", b_float);
getchar(); //防止调试窗口一闪而过
}
运行结果:
二、Python中格式化输出
笔者有时候也需要用到Python,索性把Python中的格式化打印也整理一下。
Python中格式化打印有三种方法:%(最古老)、format(2.5版本)、f-string(3.6版本)。
1. %方法
% 方法与C语言中 printf 的格式化方法很像,而 format 方法和 f-string 方法更加易读,所以 % 方法笔者知道,但是很少使用。详细用法请参考大佬文章1,这里举个简单的例子:
a = 12
print("a格式化结果是:%d" % a)
s1 = "%s" % "Hello World!"
print(s1)
# s2 = "%d" % "Hello World!"
# print(s2) # 此时会报错,类型不匹配
运行结果:
2. format方法
该方法是一种高级的格式化方法,可以格式化的方法很多,同时还能搭配推导式一起使用。老样子,总结了一个方便记忆的表格:
{<参数序号或参数关键词>:<填充> <对齐> <正负号> <#> <位宽> <千分位符> <小数位> <类型>}
各种自定义格式打印输出笔者就不一一展示了,可参考网站文章1,里面列举了很多例子方便理解。
(1) <参数序号>详解
print("今天是: {}/{}/{}/{}".format("2024年", "6月", "8日", "星期六"))
print("今天是: {0}/{1}/{2}/{3}".format("2024年", "6月", "8日", "星期六"))
print("今天是: {3}/{2}/{1}/{0}".format("2024年", "6月", "8日", "星期六"))
运行结果:
第一种和第二种相同,说明默认参数序号从左到右,从0开始递增;当然也可以自定义参数序号。
(2) <参数关键词>详解
Python中 format 函数的定义:
format函数可接收位置参数(传入的参数放在名为args的元组里)和关键词参数(传入的参数放在名为kwargs字典中。
注:当我们传入一个字典时需要加上**符号,不可省略
date_list = {'year': '2024年', 'day': '6月7日'}
# 注意:print中的“**”不能省略
print("今天是: {year}/{day}".format(**date_list))
my_list = ['6月1日', '6月2日']
your_list = ['8月1日', '8月15日']
# 注意:print中的“0”和“1”不能省略;0、1分别表示第一个、第二个列表
print("儿童节是: {0[0]}, 中秋节是: {1[1]}".format(my_list, your_list))
运行结果:
3. f-string方法
f-string 格式化以 f 或者 F 开头,字符串中的大括号 { } 中可以填入变量、表达式等。举例说明如下:
string1 = "我的介绍如下: "
string2 = "我的家人有: "
info = {"name": "洛宇", "age": "10岁"}
family = ['爸爸', '妈妈']
print(f'{string1}姓名: {info["name"]}、年龄: f{info["age"]}。\n'
f'{string2}{family[0]}、{family[1]}。')
运行结果:
三、MATLAB格式化输出
在Matlab中实现输出的方法有:disp 函数、fprintf 函数、print 函数,如下:
- disp(X) 输出变量 X 的值,而不打印变量名称,详情参考Matlab帮助文档disp
- fprintf(formatSpec,A1,…,An) 设置数据的格式并在屏幕上显示结果)函数,详情参考Matlab帮助文档fprintf
- print函数打印图窗或保存为特定文件格式,详情参考Matlab帮助文档print
注
:在Matlab帮助网页搜索框输入 “formatSpec” 字样,可以看到很详细的解释和使用方法。这里针对特殊的一点进行说明:
官方解释:
标识符: 处理函数输入参量的顺序。使用语法 n$,其中 n 代表函数调用中其他输入参量的位置。
示例: (‘%3$s %2$s %1$s %2$s’,‘A’,‘B’,‘C’) 将输入参量 ‘A’、‘B’、‘C’ 输出为:C B A B。
注:如果输入参量为数组,则不能使用标识符指定该输入参量中的特定数组元素。
最后感谢前辈们经验,参考资料如下:
[1] 书籍:《C Primer Plus 第6版 中文版》
[2] 大佬文章1:Python字符串格式化
[3] 大佬文章2:python格式化字符串的三种方法
[4] 网站文章1
[5] Matlab帮助文档disp
[6] Matlab帮助文档fprintf
[7] Matlab帮助文档print