赞
踩
以sprintf的样式格式化字符串
format formatString ?arg arg ...?
该命令以类似于ANSI C sprintf过程的方式生成格式化字符串。FormatString指示如何格式化结果,使用sprintf中的%转换说明符,如果有其他参数,则提供要替换到结果中的值。format的返回值是格式化的字符串。
该命令通过从左到右扫描formatString进行操作。格式字符串中的每个字符都会附加到结果字符串中,除非它是百分号。如果字符是%,则不会将其复制到结果字符串。相反,%字符后面的字符将被视为转换说明符。转换说明符控制下一个连续参数到特定格式的转换,并且将结果附加到结果字符串中以代替转换说明符。如果格式字符串中有多个转换说明符,则每个转换说明符控制一个附加参数的转换。必须为format命令提供足够的参数,以满足formatString中所有转换说明符的需要。
每个转换说明符最多可以包含六个不同的部分:XPG3位置说明符、一组标志、最小字段宽度、精度、大小修饰符和转换字符。除了转换字符之外,这些字段中的任何字段都可以省略。存在的字段必须按照上面给出的顺序出现。以下各段依次讨论这些领域中的每一个。
如果%后面跟着一个十进制数字和一个\$,如“%2$d”中所示,则要转换的值不会取自下一个顺序参数。相反,它取自数字指示的参数,其中1对应于第一个参数。如果转换说明符由于说明符中的*字符而需要多个参数,则会使用连续的参数,从数字给定的参数开始。这遵循位置说明符的XPG3约定。如果formatString中有任何位置说明符,那么所有说明符都必须是位置说明符。
转换说明符的第二部分可以包含下列任何标志字符,顺序不限:
指定转换后的参数应该在其字段中左对齐(如果需要,数字通常使用前导空格右对齐)。
指定即使是正数,也应始终使用符号打印数字。
指定如果第一个字符不是符号,则应在数字的开头添加空格。
指定应在数字的左侧填充零而不是空格。
请求备用输出表单。对于0转换,它保证第一个数字总是 0。对于 x 或 X 转换,0x或0X(分别)将被添加到结果的开头,除非它为零。对于 b 转换,0b 将被添加到结果的开头,除非它为零。对于所有浮点转换(e、E、f、g 和 G),它保证结果总是有一个小数点。对于 g 和 G 转换,它指定不应该删除末尾的零。
转换说明符的第三部分是一个十进制数字,给出了此转换的最小字段宽度。它通常用于使列在表格打印输出中对齐。如果转换后的参数包含的字符少于最小字段宽度,则将对其进行填充,使其与最小字段宽度一样宽。填充通常是通过在转换后的参数的左侧添加额外的空格来实现的,但是 **0** 和**\-** 标志可以分别用于指定左侧为零或右侧为空格的填充。如果最小字段宽度指定为 * 而不是数字,则**format**命令的下一个参数确定最小字段宽度;必须为整数值。
转换说明符的第四部分是精度,它由句号后跟数字组成。对于不同的转换,数字以不同的方式使用。对于 **e**、**E** 和 **f** 的转换,它指定小数点右边出现的位数。对于 **g** 和 **G** 转换,它指定要出现的数字总数,包括小数点两边的数字(但是,除非指定了#标志,小数点后面的末尾零仍将被省略)。对于整数转换,它指定要打印的最小位数(必要时将添加前导零)。对于s转换,它指定要打印的最大字符数;如果字符串比这个长,那么后面的字符将被删除。如果使用*而不是数字指定精度,则format命令的下一个参数确定精度;它必须是一个数字字符串。
转换说明符的第五部分是大小修饰符,它必须是 ll 、h 或 l。如果是 ll ,则指定不截断整数值以转换为格式化的子字符串。如果是 h,则指定在转换之前将整数值截断为16位范围。这个选项很少有用。如果为 l,则指定将整数值截断到与expr命令的wide()函数产生的范围相同的范围(至少是64位范围)。如果 h 和 l 都不存在,整数值将被截断为与expr命令的int()函数产生的相同范围(至少是32位范围,但由 tcl_platform 数组的 **wordSize** 元素的值决定)。
转换说明符中的最后一项是一个字母字符,用于确定要执行哪种转换。目前支持以下转换字符:
字母 | 描述 |
---|---|
d | 将整数转换为有符号十进制字符串。 |
u | 将整数转换为无符号十进制字符串。 |
i | 将整数转换为有符号十进制字符串(相当于d)。 |
o | 将整数转换为无符号八进制字符串。 |
x/X | 将整数转换为无符号十六进制字符串,使用数字“0123456789abcdef”表示x,“0123456789abcdef”表示x)。 |
b | 将整数转换为无符号二进制字符串,使用数字0和1。 |
c | 将整型转换为它所代表的Unicode字符。 |
s | 没有转换;只要插入字符串。 |
f | 将数字转换为形式为xx的有符号十进制字符串。yyy,其中y的数量由精度决定(默认:6)。如果精度为0,则不输出小数点。 |
e/E | 将数字转换为科学记数法,格式为x.yyye±zz,其中y的个数由精度决定(默认值:6)。如果精度为0,则不输出小数点。如果使用E表格,则打印E而不是E。 |
g/G | 如果指数小于-4或大于或等于精度,则将number转换为%e或%e。否则将其转换为%f。后面的零和小数点被省略。 |
% | 没有转换:只插入%。 |
format命令的行为与ANSI C sprintf过程相同,但有以下不同:
- Tcl保证它将使用UNICODE字符
- 不支持%p和%n说明符
- 对于%c转换,参数必须是一个整数值,然后将其转换为相应的字符值。
- 格式化浮点值时会忽略大小修饰符。ll 修饰符没有对应的sprintf。b 说明符没有对应的sprintf
数字装换字符:
set value 120
set char [format %c $value]
puts $char
# 结果:x
将输出的时间转换为秒,精度为百分之一秒:
set us [lindex [time {for {set i 0} {$i < 3} {incr i} {
set a 1
}}] 0]
puts [format "%.2f secend to execute" [expr $us/1e6]]
# 结果:0.00 secend to execute
创建一个打包的 X11 文字颜色规格:
set r 000
set g 222
set b 333
set color [format "#%02x%02x%02x" $r $g $b]
puts $color
# 结果:#00de14d
使用XPG3格式代码允许对字段进行重新排序(一种在本地化消息编目中经常使用的技术;参见msgcat),而不重新排序传递给format的数据值:
set fmt1 "Today, %d shares in %s were bought at $%.2f each"
puts [format $fmt1 123 "Global BigCorp" 19.37]
set fmt2 "Bought %2\$s equity ($%3$.2f x %1\$d) today"
puts [format $fmt2 123 "Global BigCorp" 19.37]
# 结果:
# Today, 123 shares in Global BigCorp were bought at $19.37 each
# Bought Global BigCorp equity ($19.37 x 123) today
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。