DOKK / manpages / debian 11 / manpages-zh / format.3tcl.zh_CN
format(3tcl) Tcl Built-In Commands format(3tcl)


format - 按 sprintf 的式样格式化一个字符串

总览 SYNOPSIS

format formatString ?arg arg ...?


这个命令按与ANSI C sprintf 过程相同的方式生成一个格式化了的字符串(在它的实现中使用了 sprintf)。FormatString 指示如何格式化结果,与 sprintf 一样使用 % 转换指定符(specifier),如果有增添的参数,则它们提供要被替换到结果中的值。format 的返回值是格式化了的字符串。

格式化细节 DETAILS ON FORMATTING

命令按从左到右的检索(scan) formatString 的方式操作。除了百分号之外的在格式字符串中的每个字符都要添加到结果字符串上。如果字符是一个 %则它不被复制到结果字符串中。转而,在 % 后面的字符被作为一个转换指定符对待。转换指定符控制把下一个连续的(successive) arg 转换成一个特定的格式,并把结果添加到结果字符串中转换指定符的位置上。如果在格式字符串中有多个转换指定符,则每一个控制一个增添的参数 argformat 命令必须给出足够的 args 来满足在 formatString 中的所有转换指定符的需要。

每个转换指定符可以由六部分组成: 一个 XPG3 位置指定符,一系列标志(flag),一个最小字段宽度,一个精度,一个长度修饰符(modifier),和一个转换字符。除了转换字符之外可以省略这些字段中的任何一个。存在的字段必须按上面给出的次序出现。下面的段落依次讨论所有这些字段。

如果 % 跟随着一个十进制数值和一个 $, 比如“%2$d”,则要转换的值不接受下一个顺序的参数。转而,它接受由这个数字指示的参数,这里 1 对应于第一个 arg。如果因为在指定符中有 * 字符而转换指定符要求多个参数,则使用连续的参数,开始的参数由这个数值给出。这依从 XPG3 定位指定符约定。如果在 formatString 中有任何定位的指定符则所有指定符必须定位。

一个转换指定符的第二部分可以按任意次序包含任何下列的标志字符:

-
指定被转换的参数在它的字段中左对齐(数值一般右对齐,如果需要的话,有前导的空格)。
+
指定输出的数值必须有符号,即使是正数。
指定如果数值的第一个字符不是一个符号则向数值的开始处添加空格。
0
指定应当在数值的左侧填充零而不是空格。
#
要求一中替代的输出形式。对于 oO 转换它保证第一个数字总是 0。对于 xX 转换,除了零之外,在结果的开始处(分别)添加 0x0X。对于所有浮点数转换(eEfg、和 G) 它保证结果总是一个小数点。对于 gG 转换它指定删除尾部的零。

一个转换指定符的第三部分是给出这个转换的最小字段宽度的一个数字。它典型的被用来按列表的(tabular)输出形式排列(line up)各列(column)。如果被转换的参数包含的字符比这个最小字段宽度少,则填充它来达到这个最小的字段宽度。填充通常是在被转换的参数的左侧添加额外的空格,但是可以使用 0- 标志来分别指定在左侧填充零或在右侧填充空格。如果指定最小字段宽度为 * 而不是一个数值,则用给 format 命令的下一个参数确定最小字段宽度;它必须是一个数值字符串。

一个转换指定符的第四部分是一个精度,它由一个点号和随后的一个数值组成。在不同的转换中按不同的方式使用这个数值。对于 eE、和 f 转换它指定出现在小数点右侧的数字的位数。对于 gG 转换它指定出现的数字的总数,包括在小数点两侧的数字(但是,除非指定了 # 标志,省略在小数点后面的尾部的零)。对于正数转换,它指定输出的最小的数字位数(如果需要的话添加前导的零)。对于 s 转换它指定输出的最大的字符数;如果字符串比它长则删除尾部的字符。如果用 * 而不是一个数值来指定精度,则用给 format 命令的下一个参数来确定精度;它必须是一个数值字符串。

一个转换指定符的第五部分是一个长度修饰符,它必须是 hl。如果它是 h 则指定数值值在转换之前必须被截断(truncate)成16位值。这个选项很少有用。忽略 l 修饰符。

一个转换指定符的最后一部分是确定进行那种转换的一个字母字符。当前支持下列转换字符:

把整数转换成有符号的十进制字符串。
把整数转换成无符号的十进制字符串。
把整数转换成有符号的十进制字符串;整数可以是十进制的,八进制的(有一个前导的 0) 或十六进制的(有一个前导的 0x)。
把整数转换成无符号八进制字符串。
把整数转换成无符号十六进制字符串,对 x 使用数字“0123456789abcdef”而对 X 使用数字 “0123456789ABCDEF”。
把整数转换成它代表的 Unicode 字符。
不转换,只是插入字符。
浮点数转换成有符号的 xx.yyy 形式的十进制字符串,这里的 y 的位数由精度确定(缺省: 6)。如果精度是 0 则不输出小数点。
把浮点数转换成 x.yyye±zz 形式的科学记数法,这里的 y 的位数由精度确定(缺省: 6)。如果精度是 0 则不输出小数点。如果使用 E 式样则输出 E 而不是 e
如果指数小于 -4 或大于等于精度,则把富点数按 %e%E 来转换。否则按 %f 转换。省略尾部的零和尾部的小数点。
%
不转换: 只是插入 %

数值转换,被转换的参数必须是一个正数或浮点数字符串;format 把参数转换成二进制接着依照转换指定符把它再转换成一个字符串。

与 ANSI SPRINTF 的区别 DIFFERENCES FROM ANSI SPRINTF

除了下列区别之外,format 命令的行为与 ANSI C sprintf 过程相同:

[1]
当前不支持 %p%n 指定符。
[2]
对于 %c 转换,参数必须是一个十进制字符串,它将被转换成相应的字符值。
[3]
忽略 l 修饰符;转换整数值总是有如没有修饰符存在,而转换实数值总是有如存在 l 修饰符(例如, 使用类型 double 作为内部表示)。如果指定了 h 修饰符则在转换前截断整数值。

参见 SEE ALSO

sprintf(3), string(n)

关键字 KEYWORDS

conversion specifier, format, sprintf, string, substitution

寒蝉退士

2001/08/29

《中国 Linux 论坛 man 手册页翻译计划》:

http://cmpp.linuxforum.net

本页面中文版由中文 man 手册页计划提供。
中文 man 手册页计划:https://github.com/man-pages-zh/manpages-zh

8.1 Tcl