Logo
Section 1 / 11

格式化输出

本课程讨论了 std.format 模块的特性,该模块是 D 语言标准库 Phobos 的一部分。

导入

格式化输出

本课程讨论了 std.format 模块的特性,该模块是 D 语言标准库 Phobos 的一部分。

格式化输出

std.format 模块并不是 D 语言的核心特性。与所有以 std 为前缀的模块一样,std.format 是 Phobos(D 语言的标准库)中的一个模块。

D 语言的输入输出格式说明符与 C 语言类似。格式说明符和标志总结如下:

格式说明符和标志
格式说明符和标志

我们之前一直使用 writeln 等函数,根据需要传入多个参数来打印所需输出。这些参数会被转换为字符串形式,然后发送到输出流。

但有时这种方式并不足够。输出可能需要非常特定的格式。让我们看下面这段用于显示发票项目信息的代码:

1import std.stdio; 2 3void main() { 4 double[] items; 5 items ~= 1.23; 6 items ~= 45.6; 7 8 for (int i = 0; i != items.length; ++i) { 9 writeln("Item ", i + 1, ": ", items[i]); 10 } 11}

输出结果:

1Item 1: 1.23 2Item 2: 45.6

尽管信息正确,但我们可能需要以不同的格式显示。例如,小数点(此处为点号)必须对齐,并且小数点后始终保留两位数字,如以下输出所示:

1Item 1: 1.23 2Item 2: 45.60

在这种情况下,格式化输出就非常有用。我们之前使用的 write() 和 writeln() 函数有对应的带字母 f 的版本:writef() 和 writefln()。其中 f 是 “formatted”(格式化)的缩写。这些函数的第一个参数是一个格式字符串,用于描述其余参数应如何打印。

例如,writefln() 可以通过以下格式字符串实现上述期望的输出:

1writefln("Item %d:%9.02f", i + 1, items[i]);
1import std.stdio; 2 3void main() { 4 double[] items; 5 items ~= 1.23; 6 items ~= 45.6; 7 8 for (int i = 0; i != items.length; ++i) { 9 writefln("Item %d:%9.02f", i + 1, items[i]); 10 } 11}

格式字符串

格式字符串包含普通字符(直接原样输出)和特殊的 格式说明符,每个说明符对应一个要打印的参数。格式说明符以 % 字符开头,以格式字符结尾。上面的格式字符串包含两个格式说明符:%d 和 %9.02f。

每个说明符都与 writefln() 函数中的相应参数关联,通常按出现顺序对应。例如,%d 对应 i + 1,%9.02f 对应 items[i]。每个说明符定义了其对应参数的格式。格式说明符也可以包含参数编号。

除了格式说明符外,格式字符串中的其他字符将原样输出。上述示例中的普通字符是“Item ”和“:”。

格式说明符的组成部分

格式说明符由多个部分组成,其中大多数是可选的。各部分如下:

格式说明符的组成部分
格式说明符的组成部分

注意: 这些部分之间的空格仅用于提高可读性,不是说明符的一部分。

格式说明符开头的 % 和结尾的格式字符是必需的;其余部分均为可选。

由于 % 在格式字符串中有特殊含义,如果需要将其作为普通字符输出,必须写成 %%。


在下一课中,我们将学习格式化输出的一个重要部分:格式字符。

字面量和枚举

格式化说明符:格式字符