使用字符串内插构造格式化字符串
本教程介绍了如何使用字符串内插将值插入单个字符串中。 还介绍了如何控制结果字符串的文本格式设置。 可以使用浏览器编写和运行 C# 代码,并即时查看结果。
创建内插字符串
在交互式窗口中,运行以下代码。 选择“进入焦点模式”按钮。 然后,在交互式窗口中键入以下代码块(将 <name>
替换为自己的名称),再选择“运行”:
var name = "<name>";
Console.WriteLine($"Hello, {name}. It's a pleasure to meet you!");
运行该代码时,“输出”会在问候语中显示一个包含你的姓名的字符串。 WriteLine 方法调用的字符串参数是一个内插字符串表达式。 这是一种模板,可让你用包含嵌入代码的字符串构造单个字符串(称为结果字符串)。 内插字符串表达式特别适用于将值插入字符串或连接多个字符串(将字符串联在一起)。
以上示例包含了每个内插字符串表达式必须具备的两个元素:
字符串文本以
$
字符开头,后接左双引号字符。$
符号和引号字符之间不能有空格。 (如果希望看到包含空格会发生什么情况,请在交互式窗口中的$
字符后面插入一个空格,然后运行更新的代码。C# 编译器报错“意外的字符 '$'”。)一个或多个内插表达式 。 左大括号和右大括号(
{
和}
)指示内插表达式。 可将任何返回值的 C# 表达式置于大括号内(包括null
)。
下面再尝试一些其他数据类型的字符串内插示例。
包含不同的数据类型
上一步使用了字符串内插将一个字符串插入到了另一字符串中。 不过,作为内插字符串表达式一部分的各个内插表达式可以是任何数据类型。 下面让我们在内插字符串中添加多种数据类型表达式的值。
在以下示例中,我们首先定义了具有 Name
、Price
和 perPackage
成员的 tuple。 在交互式窗口中运行以下代码:
var item = (Name: "eggplant", Price: 1.99m, perPackage: 3);
var date = DateTime.Now;
Console.WriteLine($"On {date}, the price of {item.Name} was {item.Price} per {item.perPackage} items.");
注意,内插字符串中的内插表达式 item.Price
会解析为结果字符串中的“1.99”文本。 这是因为,当表达式结果的类型不是字符串时,会按照以下方式将其解析为字符串:
如果内插表达式的计算结果为
null
,则会使用一个空字符串("" 或 String.Empty)。如果内插表达式的计算结果不是
null
,通常会调用结果表达式的ToString
方法。
在此示例的输出中,日期过于精确(eggplant 的价格不会以秒为单位变化),且价格值没有标明货币单位。 下一步将介绍如何通过控制表达式结果的字符串表示形式来解决这些问题。
控制内插表达式的格式
上一步将两个格式不正确的字符串插入到了结果字符串中。 一个是日期和时间值,只有日期是合适的。 第二个是没有标明货币单位的价格。 这两个问题都很容易解决。 通过字符串内插,可以指定用于控制特定类型格式的格式字符串 。 将前面示例中的调用修改为 Console.WriteLine
,从而包含日期和价格表达式的格式字符串,如以下行所示:
Console.WriteLine($"On {date:d}, the price of {item.Name} was {item.Price:C2} per {item.perPackage} items");
可通过在内插表达式后接冒号(“:”)和格式字符串来指定格式字符串。 “d”是标准日期和时间格式字符串,表示短日期格式。 “C2”是标准数值格式字符串,用数字表示货币值(精确到小数点后两位)。
.NET 库中的许多类型支持一组预定义的格式字符串。 这些格式字符串包括所有数值类型以及日期和时间类型。 有关支持格式字符串的完整类型列表,请参阅 .NET 中的格式化类型文章中的格式字符串和. NET 类库类型。
尝试修改示例中的格式字符串,查看更改如何影响日期、时间和数值的格式。 将 {date:d}
中的“d”更改为“t”(显示短时间格式)、“y”(显示年份和月份)和“yyyy”(显示四位数年份)。 将 {price:C2}
中的“C2”更改为“e”(用于指数计数法)和“F3”(使数值在小数点后保持三位数字)。
除了控制格式之外,还可以控制结果字符串中包含的格式字符串的字段宽度和对齐方式。 下一步将介绍如何执行此操作。
控制内插表达式的字段宽度和对齐方式
通常,当内插字符串表达式的结果格式化为字符串时,结果字符串中会包含该字符串,但没有前导或尾随空格。 特别是对于使用一组数据的情况,控制字段宽度和对齐方式有助于增强输出的可读性。 若要查看,请运行以下代码:
var inventory = new Dictionary<string, int>()
{
["hammer, ball pein"] = 18,
["hammer, cross pein"] = 5,
["screwdriver, Phillips #2"] = 14
};
Console.WriteLine($"Inventory on {DateTime.Now:d}");
Console.WriteLine(" ");
Console.WriteLine($"|{"Item",-25}|{"Quantity",10}|");
foreach (var item in inventory)
Console.WriteLine($"|{item.Key,-25}|{item.Value,10}|");
项目名称为左对齐,其数量为右对齐。 通过在内插表达式后面添加一个逗号(“,”)并指定“最小”字段宽度来指定对齐方式。 如果指定的值是正数,则该字段为右对齐。 如果它为负数,则该字段为左对齐。
尝试删除 {"Item",-25}
和 {item.Key,-25}
代码中的负号,然后再次运行该示例。 此时,项名为右对齐。
可合并单个内插表达式中的对齐说明符和格式字符串。 为此,请先指定对齐方式,然后是冒号和格式字符串。 尝试以下示例代码,该代码使用定义的字段宽度显示三个格式化字符串:
Console.WriteLine($"[{DateTime.Now,-20:d}] Hour [{DateTime.Now,-10:HH}] [{1063.342,15:N2}] feet");
你有关于此部分的问题? 如果有,请向我们提供反馈,以便我们对此部分作出改进。