将一个对象转换成对应的字符串对象的过程称之为格式化(format)。在仓颉中,std.convert包为Float32、Float64、Int32、Int64、UInt32、UInt64等类型扩展实现了format成员函数。在导入std.convert包后,再执行这些对象的format成员函数,即可将对象“转换”成对应的字符串表达形式。
而上述format成员函数,包含了一个名为fmt的字符串类型的参数,用于指定转换格式。
1. 简单格式化示例
下述示例将浮点数对象pi按指定格式转换成字符串并打印至屏幕。
1 | package StrFormat |
上述代码的执行结果为:
1 | 3.1416 |
▶第2行:导入std标准模块下的convert(格式化)包。程序第6行所使用的格式化函数是由该包定义的。
▶第5行:定义圆周率不可变变量pi,为尽可能提高存储精度,这里使用了Float64类型。
▶第6行:在导入了std.convert之后,pi作为Float64类型的对象,便拥有了成员函数format。
如执行结果第1行所示,pi.format(“.4”)将pi格式化,生成了将pi保留4位小数的字符串“3.1416”。format函数的参数”.4”为一个字符串字面量,它表明转换格式为“保留4位小数”。不难看出,3.1415926在格式化保留4位小数的过程中被四舍五入,变成了3.1416。
如执行结果第2行所示,pi.format(“+20.10”)将pi格式化为显示正负号(+)、包含20个字符、保留10位小数、右对齐的字符串,不足部分使用空格补齐。
请注意,pi.format(x)只是根据pi值以及格式串x的要求生成并返回一个新的字符串对象,浮点数对象pi在函数执行前后类型和值都保持不变。
▶第7行:将格式化结果字符串s1和s1通过println和print函数打印至屏幕。
2. 格式化参数
根据仓颉文档,format(fmt:String):String函数的fmt参数用于指定格式化参数,这些参数用于规定转换结果的宽度、对齐方式、精度等信息。格式化参数fmt的语法格式为:
[flags][width][.precision][specifier]
其中,方括号表示这些字段为可选,即格式化参数并不需要完整包含上述4个字段。
3. flags
flags字段可以包含”-“、”+”、”#”、“0”四个字符中的1个或多个。
- “-“适用于Int、UInt、Float等类型,表示左对齐。
1 | package Alignment |
上述程序的执行结果为:
1 | -17 |
▶第6行:格式化参数”-20”中的”-“属于flags字段,表示转换结果应为左对齐;”20”则属于width字段,表示结果字符串应包含20个字符,不足部分用空格补齐。
▶第9行:格式化参数未要求左对齐,默认右对齐。如执行结果第2行所见,format成员函数通过在左侧补充空格的方式满足20的宽度要求。
- “+”适用于Int、UInt、Float,表示对正数输出+号
1 | package Plus |
上述程序的执行结果为:
1 | +7.128700 |
如执行结果第2行所见,当给负值使用”+”时,于转换结果不构成影响。
- “#” - 为转换结果添加进制符号
具体地,为二进制结果补充0b或者0B,为16进制结果补充0x或者0X,为8进制结果补充0o或者0O。当输出结果为10进制时,不起作用。该符号预期与specifier中的进制符号x,b等联合使用。
1 | package Sharp |
上述程序的执行结果为:
1 | 0x7d //x导致了7d, #号附加了0x |
- “0”适用于Int, UInt和Float,用于在空位补0
1 | package ZeroLeading |
上述程序的执行结果为:
1 | 0000000000072.638665 |
4. width - 宽度
v.format(“20”)中的20即为宽度。宽度应为正整数,适用于Int,UInt,Float等类型。宽度前有”-“表示左对齐,否则右对齐。
1 | package Width |
上述程序的执行结果为:
1 | 123456 |
5. precision - 精度
精度常用于指定浮点数小数点后的数字位数,如果不指定,则默认输出6位小数。
1 | package Precision |
上述程序的执行结果为:
1 | 12345.679 |
6. specifier
- b, B,o, O, x, X用于指定进制,适用于Int和UInt类型
b为小写2进制,B为大写2进制; o为小写8进制,O为大写8进制; x为小写16进制,X为大写16进制; 默认10进制。
如前所述,上述进制符号可与flags中的”#”号配合使用。
1 | package Base |
上述程序的执行结果为:
1 | 1000111011011 |
- e, E,g, G适用于Float类型
e表示小写的科学计数法,E表示大写的科学计数法; g或G源于general(常规),表示让仓颉在科学计数法和普通10进制计数法中自动选择较为精单的表达方式。
1 | package Scientific |
上述程序的执行结果为:
1 | 1.234568e+03 //e |