'''
2022年05月05日
字符串的format 方法非常强大,能满足我们遇到的大部分需求,可谓博大精深。
强烈建议大家认真学习format方法,熟练使用
举几个栗子供大家打牙祭
'''
##例(1)指定小数位数
outStr = "{outNum:0>8.3f}".format(outNum=1.1415)
## outNum是自己定义的“元字符”,根据关键字实现映射
## {}和:是格式符号。
## {}里面的内容为需要格式化的内容
## :前面的outNum是映射对象,:后面的内容是映射对象的格式
## 小数点后面的3f 表示3位小数
## 小数点前面的8表示这个数一共8个字符,小数点也算一个字符
## 冒号后面的0>表示如果这个字符不够8位,那么在左边补零
## 如果超过了8位,看例(2)
## 除了补0这种常规做法,还可以补其他的字符,看例(3)
print(outStr,type(outStr),len(outStr))
## 输出结果为 0001.141 <class 'str'> 8,表示outStr是一个长度为8的字符串
## 例(2) 超过8位
outStr = "{outNum:0>8.3f}".format(outNum=2345678.1415) ## outNum超过了8位
print(outStr,type(outStr),len(outStr))
## 输出结果为 2345678.141 <class 'str'> 11
##把前面的数保留下来了,比较合乎常理。
##例(3) 左边用其他字符填充
outStr = "{outNum:k>8.3f}".format(outNum=3.1415)##k
print(outStr,type(outStr),len(outStr)) ## 输出:kkk3.142 <class 'str'> 8
outStr = "{outNum:好>8.3f}".format(outNum=3.1415)##好
print(outStr,type(outStr),len(outStr)) ## 输出:好好好3.142 <class 'str'> 8
outStr = "{outNum:>8.3f}".format(outNum=3.1415)##空白
print(outStr,type(outStr),len(outStr)) ## 输出 : 3.142 <class 'str'> 8
## 在写这一段的时候想到了进一步改进上位机显示效果的方法,改进后显示更为清爽。 可谓温故知新。2022年5月5日
##例(4)只输出整数,要求outNum为整数:
outStr = "{outNum:0>4}".format(outNum=8)
print(outStr,type(outStr),len(outStr))
## 输出结果为 0008 <class 'str'> 4
outStr = "{outNum:0>3}".format(outNum=round(4.1415))##需要转为整数
print(outStr,type(outStr),len(outStr))
## 输出结果为 004 <class 'str'> 3
##例(5)还可以顺带做一些简单的运算:
outNum0 = 300 #绝对温度 K
outStr = "{outNum:0>6.2f}".format(outNum = outNum0 - 273.15)#摄氏温度 C
print(outStr,type(outStr),len(outStr))
##026.85 <class 'str'> 6
## 例(6)循环操作完成list的转换
outNum0 = [12.568,2.3,3.1415,123.4]
outStrList = ["{outNum:0>5.2f}".format(outNum = xx) for xx in outNum0]
print(outStrList) ## ['12.57', '02.30', '03.14', '123.40']
## 例(7)同时完成多个关键字的转换
outNum0 = 303.123 #绝对温度 K
outStr = "{outNumC:0>6.2f}C, {outNumF:0>6.2f}F".format(outNumC = outNum0 - 273.15,outNumF=32+(outNum0-273.15)*1.8 )#摄氏温度 C; 华氏温度 F
print(outStr) ## 029.97C, 085.95F
## 例(8)关键字还可以乱入,杀回马枪
outNum0 = 303.123 #绝对温度 K
outStr = "{outNumC:0>6.2f}C, {outNumF:0>6.2f}F,又来一个{outNumC:0>6.2f}C".format(outNumC = outNum0 - 273.15,outNumF=32+(outNum0-273.15)*1.8 )#摄氏温度 C; 华氏温度 F
print(outStr) ## 029.97C, 085.95F,又来一个029.97C
## 例(9) 这个>表示右对齐,其实<和^都可以用,分别表示左对齐与居中对齐
## 例(10) 进制转换
outNum0 = 17
outStr = "二进制:{outNum:0>8b},十六进制:{outNum:0>4x}".format(outNum = outNum0)
print(outStr) ## 二进制:00010001,十六进制:0011
outStr = "二进制:{outNum:0>8b},十六进制(小写):{outNum:0>4x},十六进制(大写):{outNum:0>2X}".format(outNum = outNum0)
print(outStr) ## 二进制:00001110,十六进制(小写):000e,十六进制(大写):0E
########## 上面的例子是通过自定义的关键字outNum来实现映射的,还有其他的办法也可以实现映射。
## 例(11)对于一个对象,可以通过对象属性进行映射
## 例(12)对于一个list可以通过下标进行映射
outNum0 = [12.58,12.34,3.1415,123.4]
outStr = "{outNum[0]:0>5.2f},{outNum[1]:0>6.2f}".format(outNum = outNum0)
print(outStr) ## 12.58,012.34
## 例(13)对于一个字典可以通过键进行映射
##还有根据位置进行映射的,但我觉得那种用法过于滥情,就不打算说了。
##熟练掌握format,字符格式无忧。