程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

C#语言学习笔记18 —— 字符串格式化要点

balukai 2025-05-22 09:12:47 文章精选 1 ℃

C# 字符串格式化要点

字符串格式化(formatting,姑且这么翻译)是把数据(类实例、结构体实例或枚举值等)转化为一个代表字符串(string representation)的过程。这个字符串一般用来向用户显示,或用于保存供以后再读取(deserialize)出来。

基本机制是 Object.ToString,这是系统的默认实现。 同时,.NET 又提供了其它方式,用来修改或增强原来的实现,主要有以下几种方式:

  • 重载 Object.ToString 方法
  • 使用格式说明符( format specifiers)
  • 使用格式提供程序(format providers)的特定区域性(culture)
  • 实现 IFormattable 接口
  • 使用复合格式化(composite formatting)
  • 使用字符串内插(string interpolation)
  • 实现接口 ICustomFormatter 和 IFormatProvider

Object.ToString 默认返回值是类型的名称。

基元(primitive)值类型的 ToString 方法已重写为显示对象值(而不是对象名称)。 并大都提供额外的 ToString 重载,有参数 IFormatProvider 和(或) 格式化字符串( format specifiers)。

基元(primitive)值类型主要指整数类型、浮点数、Decimal、Boolean、Char、日期时间类型、GUID 等。

格式字符串

对象的值通常具有多种表示形式。 例如:整数值 10 可以表示为多种形式,包括 10、10.0、1.0e01 或 $10.00。

.NET 使用格式字符串。 格式字符串是包含一个或多个预定义格式说明符的字符串,这些格式说明符是单一字符或字符组,用于定义 ToString 方法应如何设置其输出格式。

格式字符串是按对象的类型分类的,数值类型的格式化字符和日期时间的格式化字符是两码事,同一个字符意思完全不相同。

对于数值类型、日期时间类型、TimeSpan,有标准和自定义两种。枚举类型也有它的格式字符串。

格式字符串的格式说明符太多了,去查看官方文档吧!

下面为 C# Interactive 窗口代码片段

宽度指定

宽度部分(Width component 宽度组件,可选)

如果实际长度大于width,则width被忽略。width 正数,右对齐;width 负数,左对齐。

下面为代码片段

区域文化指定

格式化的结果还受到系统区域文化设置的影响。

区域文化指定,默认值
CultureInfo.CurrentCulture。

需要文化独立时,可使用 InvariantCulture。

下面为 C# Interactive 窗口代码片段

字符串内插(String interpolation)和 复合格式设置(Composite formatting)异同

语法上不一样,但有相同的部分。分别为 {expression[,width][:formatString]} 和 {index[,width][:formatString]}。

一个使用表达式,另一个使用参数列表索引号。

宽度(width)和格式化字符串(formatString),都有这两部分,均为可选项。这两部分的功能都一样。

花括号{}是语法的一部分,如果作为输出,需要转义。

字符串内插是较新的语法,更容易阅读。复合格式设置的语法一开始就有。

字符串内插(String interpolation)

语法为 {expression[,width][:formatString]}。

对于表达式(expression)部分, 如果值为 null,返回string.Empty;如果值不为 null,典型地,返回对象的 ToString 方法。

如果要包含 "{" 或 "}",指定 "{{" 或 "}}"。

使用条件操作符 ?: 时,要加上括号。

$@"..." 和 @#34;..." 都是合法。

下面为 C# Interactive 窗口代码片段

复合格式设置(Composite formatting)

语法为 {index[,width][:formatString]}。

常使用于以下方法中

  • String.Format
  • StringBuilder.AppendFormat
  • Console.WriteLine
  • TextWriter.WriteLine,派生类 StreamWriter, HtmlTextWriter
  • Debug.WriteLine
  • Trace类TraceError,TraceInformation,TraceWarning
  • TraceSource.TraceInformation

格式化项,如{0},{1},{2}等,从0开始编号。

格式化项编号可以重复出现,如"0x{0:X} {0:E} {0:N}"。出现次序可以任意,如"{1} {0} {2}"。

下面为 C# Interactive 窗口代码片段

重载 Object.ToString 方法 和实现 IFormattable 接口

重载 Object.ToString 方法 和实现 IFormattable 接口,能让自定义类更方便地格式化为字符串。

下面是个例子,代码功能完整,但需要补充为完整程序下才能运行。

结束语

.NET 的字符串格式化的功能丰富,但符号众多,不好记忆,需要频繁查阅文档。

最近发表
标签列表