练习 - 了解字符串格式设置基础知识
- 20 分钟
在本单元中,你将了解格式化字符串以高效显示的方法,尤其是对于使用多个变量的情况。
准备编码环境
本模块包括指导你完成生成和运行演示代码的过程的动手活动。 建议使用 Visual Studio Code 作为开发环境来完成这些活动。 使用 Visual Studio Code 来完成这些活动可帮助你在由全球专业人员使用的开发人员环境中更舒适地编写和运行代码。
备注
如果已完成此 C# 系列中的其他 Microsoft Learn 模块,则可能已经为代码示例创建了一个项目文件夹。 如果是这种情况,可以跳过步骤的以下部分,并删除用于上一练习的 Project.cs 文件中的代码。
打开 Visual Studio Code。 可以使用 Windows“开始”菜单(或等效资源 [对于其他 OS])打开 Visual Studio Code。
在 Visual Studio Code 的“文件”菜单上,选择“打开文件夹”。
在“打开文件夹”对话框中,导航到 Windows“桌面”文件夹。 如果使用了其他文件夹位置来保存代码项目,可以改用该文件夹位置。 对于此培训,重要的是要有一个易于定位和记忆的位置。
在“打开文件夹”对话框中,选择“选择文件夹”。 如果看到一个询问是否信任作者的安全对话框,请选择“是”。
在 Visual Studio Code 的“终端”菜单上,选择“新终端”。 请注意,“终端”面板中的命令提示符显示当前文件夹的文件夹路径。 例如:
C:\Users\someuser\Desktop>在终端命令提示符处,若要在指定文件夹中新建控制台应用程序,请键入“dotnet new console -o ./CsharpProjects/TestProject”,然后按 Enter。 此 .NET CLI 命令使用 .NET 程序模板在指定文件夹位置创建新的 C# 控制台应用程序项目。 该命令会创建 CsharpProjects 和 TestProject 文件夹,并使用 TestProject 作为
.csproj文件的名称。在“资源管理器”面板中,展开“CsharpProjects”文件夹。 你应会看到 TestProject 文件夹和两个文件,一个名为 Program.cs 的 C# 程序文件和一个名为 TestProject.csproj 的 C# 项目文件。
在 EXPLORER 面板中,若要在编辑器面板中查看代码文件,选择 Program.cs。
删除现有代码行。 在本模块中,请使用此 C# 控制台项目来创建、生成和运行代码示例。
关闭“终端”面板。
什么是复合格式设置?
复合格式化在字符串中使用带编号的占位符。 在运行时,大括号内的所有内容都将解析为一个值,该值也是根据大括号的位置传入的。
此复合格式设置示例对 Format() 数据类型关键字使用 string 内置方法。 在 Visual Studio Code 编辑器中更新代码,如下所示:
string first = "Hello";
string second = "World";
string result = string.Format("{0} {1}!", first, second);
Console.WriteLine(result);
如果运行此代码,会看到以下输出。
Hello World!
关于此代码,需要注意几项重要事项。
- 给定数据类型的数据类型和变量具有内置“帮助程序方法”,可简化某些任务。
- 文本字符串
"{0} {1}!"构成一个模板,其中部分内容在运行时被替换。 - 标记
{0}替换为字符串模板后的第一个参数,即first变量的值。 - 标记
{1}替换为字符串模板后的第二个参数,即second变量的值。
备注
你可能会认为以数字 0 开头很奇怪。 实际上,这在软件部署中非常常见。 只要有一系列可使用数字标识的项,编号通常就是从 0 开始。
按以下方式更新您的代码:
string first = "Hello"; string second = "World"; Console.WriteLine("{1} {0}!", first, second); Console.WriteLine("{0} {0} {0}!", first, second);保存代码文件,然后使用 Visual Studio Code 运行代码。 应会看到以下输出:
World Hello! Hello Hello Hello!
对这些示例的一些观察:
- 对于第一个
Console.WriteLine()语句,会看到标记可按任意顺序排列。 示例代码在{1}之前会出现{0}。 - 对于第二个
Console.WriteLine()语句,会看到标记可与{0}的三个实例一起重复使用。 此外,不使用第二个变量参数second。 但代码仍可正常运行。
什么是字符串内插?
“字符串内插”是一种可简化复合格式化的技术。
只需使用大括号内的变量名,而不需要使用有编号的标记,并在 String.Format() 或 Console.WriteLine() 参数列表中包括文本值或变量名称。
为了对字符串进行插值,必须在其前面加上
$指令。 现在,请使用字符串插值而不是复合格式来创建之前相同的示例。 按以下方式更新您的代码:string first = "Hello"; string second = "World"; Console.WriteLine($"{first} {second}!"); Console.WriteLine($"{second} {first}!"); Console.WriteLine($"{first} {first} {first}!");保存代码文件,然后使用 Visual Studio Code 运行代码。 应会看到以下输出:
Hello World! World Hello! Hello Hello Hello!
备注
如果在书籍和网络中查看代码示例,可能会发现同时使用了“复合格式化”和“字符串插值”,但通常应该选择“字符串插值”。
设置货币格式
复合格式设置和字符串内插可用于根据特定语言和区域性设置显示值的格式。 在下面的示例中,:C 货币格式说明符用于将 price 和 discount 变量以货币形式显示。 按以下方式更新您的代码:
decimal price = 123.45m;
int discount = 50;
Console.WriteLine($"Price: {price:C} (Save {discount:C})");
如果在 Windows 显示语言设置为“英语(美国)”的计算机上执行此代码,会看到以下输出。
Price: $123.45 (Save $50.00)
请注意,无论使用 :C 还是 int,在大括号内的标记中添加 decimal 都会将数字格式化为货币。
备注
如果国家/地区和语言未知,会发生什么情况? 如果在“浏览器内”.NET 编辑器中运行前面的代码(例如在 TrydotNet 中),将看到以下输出:Price: ¤123.45 (Save ¤50.00)。 使用 ¤ 符号,而不是所在国家/地区的货币符号。 这是用于在任何货币类型下表示“货币”的通用符号。 在 .NET 编辑器中显示此符号,因为此符号会忽略当前位置。
用户的国家/地区和语言对字符串格式设置的影响
如果在法国的一台“Windows 显示语言”设置为“法语”的计算机上执行前面的代码,会怎样? 在此情况下,会显示以下输出。
Price: 123,45 € (Save 50,00 €)
前面输出“€”的原因是,字符串货币格式设置功能取决于本地计算机的“区域性”设置。 在此上下文中,术语“区域性”指的是最终用户的国家/地区和语言。 “区域性代码”是一个由五个字符组成的字符串,计算机使用它来标识最终用户的位置和语言。 文化代码确保可以正确显示日期和货币等特定信息。
例如:
- 美国说英语的人的区域性代码是
en-US。 - 法国说法语的人的文化代码是
fr-FR。 - 加拿大法语使用者的文化代码是
fr-CA。
文化影响书写系统、所用日历、字符串排序,以及日期和数字的格式(如货币格式)。
遗憾的是,确保代码在所有计算机上正常运行,而不受最终用户的国家/地区或语言影响,这确实具有挑战性。 此过程称为本地化(或全球化)。 本地化取决于本模块中未讨论的许多因素,但简单地说,字符串格式设置语法可能会根据用户的区域性使用不同的格式。
设置数值格式
处理数字数据时,可能需要用逗号分隔千位、百万位、十亿位等来设置数字格式,提高其可读性。
N 数值格式说明符使数字更具可读性。 按以下方式更新您的代码:
decimal measurement = 123456.78912m;
Console.WriteLine($"Measurement: {measurement:N} units");
如果以 en-US 文化查看此项,会看到以下输出。
Measurement: 123,456.79 units
N 数值格式说明符默认仅显示小数点后两位数字。
如果要以更高的精度显示,可通过在说明符后面添加数字来实现。 下面的代码将使用 N4 说明符显示小数点后四位数字。 按以下方式更新您的代码:
decimal measurement = 123456.78912m;
Console.WriteLine($"Measurement: {measurement:N4} units");
如果以 en-US 文化查看此项,会看到以下输出。
Measurement: 123,456.7891 units
设置百分比的格式
使用 P 格式说明符设置百分比的格式,并将百分比舍入为 2 个小数位。 之后添加一个数字来控制小数点后显示位数。 按以下方式更新您的代码:
decimal tax = .36785m;
Console.WriteLine($"Tax rate: {tax:P2}");
如果以 en-US 文化查看此项,会看到以下输出。
Tax rate: 36.79%
结合格式设置方法
字符串变量可以存储使用格式设置方法创建的字符串。 在以下示例中,小数和小数数学运算结果使用复合格式设置进行格式化,并存储在 yourDiscount 字符串中。
更新代码如下。
decimal price = 67.55m;
decimal salePrice = 59.99m;
string yourDiscount = String.Format("You saved {0:C2} off the regular {1:C2} price. ", (price - salePrice), price);
Console.WriteLine(yourDiscount);
如果以 en-US 文化查看此项,会看到以下输出。
You saved $7.56 off the regular $67.55 price.
可以组合多个格式化字符串。 在前面代码的基础上,通过将 yourDiscount += $"A discount of {(price - salePrice)/price:P2}!"; 插入到 Console.WriteLine() 之前行的代码中,以使用字符串内插而非字符串连接来连接计算的百分比。
备注
不需要将 String.Format() 与此字符串内插方法一起使用。
更新代码如下。
decimal price = 67.55m;
decimal salePrice = 59.99m;
string yourDiscount = String.Format("You saved {0:C2} off the regular {1:C2} price. ", (price - salePrice), price);
yourDiscount += $"A discount of {((price - salePrice)/price):P2}!"; //inserted
Console.WriteLine(yourDiscount);
如果您是从 en-US 文化查看此单元,您将看到以下输出。
You saved $7.56 off the regular $67.55 price. A discount of 11.19%!
回顾
下面是此单元中有关字符串格式设置的最重要的要点:
- 可以使用复合格式设置或字符串内插来设置字符串格式。
- 借助复合格式设置,可使用包含具有 格式的一个或多个替换标记的字符串模板
{0}。 你还可提供参数列表,这些参数根据其顺序与替换标记相匹配。 使用string.Format()或Console.WriteLine()时,复合格式设置有效。 - 借助字符串内插,可通过以大括号括起来的形式使用字符串模板,其中包含要替换的变量名。 在字符串模板之前使用
$指令,以指示希望对字符串进行插值。 - 使用
:C说明符设置货币的格式。 - 使用
:N说明符设置数字的格式。 在数字后使用:N,如{myNumber:N3},控制精度(小数点后的位数)。 - 使用
:P格式说明符设置百分比的格式。 - 货币和数字的格式设置取决于最终用户的区域性,这是一个五个字符的代码,其中包括用户的国家/地区和语言(具体取决于计算机的设置)。