tcl-format

format

以sprintf的样式格式化字符串

语法:

format formatString ?arg arg ...?

引言:

该命令以类似于ANSI C sprintf过程的方式生成格式化字符串。FormatString指示如何格式化结果,使用sprintf中的%转换说明符,如果有其他参数,则提供要替换到结果中的值。format的返回值是格式化的字符串。

详细信息:

该命令通过从左到右扫描formatString进行操作。格式字符串中的每个字符都会附加到结果字符串中,除非它是百分号。如果字符是%,则不会将其复制到结果字符串。相反,%字符后面的字符将被视为转换说明符。转换说明符控制下一个连续参数到特定格式的转换,并且将结果附加到结果字符串中以代替转换说明符。如果格式字符串中有多个转换说明符,则每个转换说明符控制一个附加参数的转换。必须为format命令提供足够的参数,以满足formatString中所有转换说明符的需要。

每个转换说明符最多可以包含六个不同的部分:XPG3位置说明符、一组标志、最小字段宽度、精度、大小修饰符和转换字符。除了转换字符之外,这些字段中的任何字段都可以省略。存在的字段必须按照上面给出的顺序出现。以下各段依次讨论这些领域中的每一个。

可选位置说明符:

如果%后面跟着一个十进制数字和一个\$,如“%2$d”中所示,则要转换的值不会取自下一个顺序参数。相反,它取自数字指示的参数,其中1对应于第一个参数。如果转换说明符由于说明符中的*字符而需要多个参数,则会使用连续的参数,从数字给定的参数开始。这遵循位置说明符的XPG3约定。如果formatString中有任何位置说明符,那么所有说明符都必须是位置说明符。

可选标志:

转换说明符的第二部分可以包含下列任何标志字符,顺序不限:

- :
指定转换后的参数应该在其字段中左对齐(如果需要,数字通常使用前导空格右对齐)。
+ :
指定即使是正数,也应始终使用符号打印数字。
space :
指定如果第一个字符不是符号,则应在数字的开头添加空格。
0 :
指定应在数字的左侧填充零而不是空格。
# :
请求备用输出表单。对于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。后面的零和小数点被省略。
%没有转换:只插入%。

与ANSI sprintf的区别:

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
  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值