Skip to content
On this page

字符串格式设置基础知识

本单元将介绍如何设置字符串的格式,使其准确显示此信息并且形式比字符串串联更简洁。

字符串格式设置

什么是复合格式设置?

复合格式设置在字符串中使用带编号的占位符。在运行时,大括号内的所有内容都将解析为一个值,该值也是根据大括号的位置传入的。

下面为复合格式设置的示例:对 string 数据类型关键字上使用 Format() 内置方法:

csharp
string first = "Hello";
string second = "World";
string result = string.Format("{0} {1}!", first, second);
Console.WriteLine(result);

我们将讨论 string 数据类型的变量和 string 类型变量上可用的不同类型内置方法。

bash
Hello World!

关于此代码,需要注意几项重要事项。

  • 给定数据类型的数据类型和变量具有内置“帮助程序方法”,可简化某些任务。
  • 文本字符串 "{0} {1}!" 构成一个模板,其中部分内容将在运行时被替换。
  • 标记 {0} 替换为字符串模板后的第一个参数,即 first 变量的值。
  • 标记 {1} 替换为字符串模板后的第二个参数,即 second 变量的值。

备注

你可能会认为以数字 0 开头很奇怪。其实这在软件部署中非常常见。只要有一系列可使用数字标识的项,编号通常就是从 0 开始。

为了进一步实践这一想法,请思考以下代码:

csharp
string first = "Hello";
string second = "World";
Console.WriteLine("{1} {0}!", first, second);
Console.WriteLine("{0} {0} {0}!", first, second);

运行此代码时,应会看到以下输出:

bash
World Hello!
Hello Hello Hello!

对这些示例的一些观察:

  • 对于第一个 Console.WriteLine() 语句,可看到标记可按任意顺序排列。此示例中,{0} 位于 {1} 之前。
  • 对于第二个 Console.WriteLine() 语句,可看到可重复使用标记,甚至可忽略传入的变量参数。

什么是字符串内插?

字符串内插是一种可简化复合格式设置的较新方法。如果通过书籍和联机方式查看代码示例,可能会发现使用了两种方法,但通常应首选字符串内插。

只需使用大括号内的变量名,而不需要使用有编号的标记,并在 String.Format()Console.WriteLine() 参数列表中包括文本值或变量名称。

若要让字符串成为内插,必须使用 $ 指令作为前缀。下面是之前使用字符串内插而非复合格式设置的示例:

csharp
string first = "Hello";
string second = "World";
Console.WriteLine($"{first} {second}!");
Console.WriteLine($"{second} {first}!");
Console.WriteLine($"{first} {first} {first}!");

如果运行代码,将获得以下输出:

bash
Hello World!
World Hello!
Hello Hello Hello!

设置货币格式

可使用复合格式设置和字符串内插,根据特定语言和区域性设置显示值的格式。在下面的示例中,:C 货币格式说明符用于将 pricediscount 变量以货币形式显示。

csharp
decimal price = 123.45m;
int discount = 50;
Console.WriteLine($"Price: {price:C} (Save {discount:C})");

在 .NET 编辑器中运行代码后,会看到以下输出:

bash
Price: ¤123.45 (Save ¤50.00)

使用 ¤ 符号,而不是所在国家/地区的货币符号。这是用于在任何货币类型下表示“货币”的通用符号。在 .NET 编辑器中将显示此符号,因为此符号会忽略当前位置。

但是,如果在美国使用“Windows 显示语言”设置为“英语”的计算机执行此代码,会得到以下输出:

bash
Price: $123.45 (Save $50.00)

请注意,无论使用 int 还是 decimal,在大括号内的标记中添加 :C 都会将数字格式化为货币。

用户的国家/地区和语言对字符串格式设置的影响

如果在法国使用“Windows 显示语言”设置为“法语”的计算机执行以上代码,会怎样?在此情况下,会显示以下输出:

bash
Price: 123,45  (Save 50,00 )

出现此输出的原因是,这些字符串格式设置功能的使用依赖于计算区域性。在此上下文中,术语“区域性”指的是最终用户的国家/地区和语言。区域性代码是一个具有五个字符的字符串,计算机使用它来识别最终用户的位置和语言,从而确保正确地显示某些信息,如日期和货币。

例如:

  • 美国说英语的人的区域性代码是 en-US
  • 法国说法语的人的区域性代码是 fr-FR
  • 加拿大说法语的人的区域性代码是 fr-CA

区域性影响书写系统、使用的日历、字符串的排序顺序以及日期和数字的格式设置(如货币格式设置)。

遗憾的是,确保代码在所有计算机上都能正常运行,而不考虑最终用户的国家/地区或语言是否具有挑战性。此过程称为本地化(或全球化)。本地化依赖于许多因素,我们无法在此模块详细介绍。现请注意,根据用户的区域性,字符串格式设置语法可能使用不同的格式。

设置数值格式

处理数字数据时,可能需要通过包含逗号来分隔千位、百万位、十亿位等来设置数字格式,提高其可读性。

N 数值格式说明符执行此操作。

csharp
decimal measurement = 123456.78912m;
Console.WriteLine($"Measurement: {measurement:N} units");

如果以 en-US 区域性查看此项,会得到以下输出:

bash
Measurement: 123,456.79 units

N 数值格式说明符默认仅显示小数点后两位数字。

如果要以更高的精度显示,可在说明符后面添加数字。下面的代码将使用 N4 说明符显示小数点后四位数字:

csharp
decimal measurement = 123456.78912m;
Console.WriteLine($"Measurement: {measurement:N4} units");

如果以 en-US 区域性查看此项,会得到以下输出:

bash
Measurement: 123,456.7891 units

设置百分比的格式

可以使用 P 格式说明符设置百分比的格式。之后添加一个数字来控制小数点后显示位数。

csharp
decimal tax = .36785m;
Console.WriteLine($"Tax rate: {tax:P2}");
bash
Tax rate: 36.79 %

概括回顾

下面是此单元中有关字符串格式设置的最重要的要点:

  • 可以使用复合格式设置或字符串内插来设置字符串格式。
  • 借助复合格式设置,可使用包含具有 {0} 格式的一个或多个替换标记的字符串模板。你还可提供参数列表,这些参数根据其顺序与替换标记相匹配。使用 string.Format()Console.WriteLine() 时,复合格式设置有效。
  • 借助字符串内插,可通过以大括号括起来的形式使用字符串模板,其中包含要替换的变量名。可以在字符串模板之前使用 $ 指令,指示要让字符串成为内插。
  • 可以使用 :C 说明符设置货币的格式。
  • 可以使用 :N 说明符设置数字格式。可以通过在数字后使用 :N(如 {myNumber:N3})来控制精度(小数点后的位数)。
  • 货币和数字的格式设置取决于最终用户的区域性,这是一个五个字符的代码,其中包括用户的国家/地区和语言(具体取决于计算机的设置)。