当前位置: 首页 > news >正文

复合格式化 AppendFormat 字符

.NET Framework 复合格式化功能使用对象列表和复合格式字符串作为输入。复合格式字符串由固定文本和索引占位符混和组成,其中索引占位符称为格式项,对应于列表中的对象。格式化操作产生的结果字符串由原始固定文本和列表中对象的字符串表示形式混和组成。

诸如 Format、AppendFormat 等方法以及 WriteLine 和 TextWriter.WriteLine 的某些重载支持复合格式化功能。String.Format 方法产生格式化的结果字符串,AppendFormat 方法将格式化的结果字符串追加到 StringBuilder 对象,Console.WriteLine 方法将格式化的结果字符串显示到控制台,TextWriter.WriteLine 方法将格式化的结果字符串写入流或文件。

复合格式字符串

复合格式字符串和对象列表将用作支持复合格式化功能的方法的参数。复合格式字符串由零个或多个固定文本段与一个或多个格式项混和组成。固定文本是所选择的任何字符串,并且每个格式项对应于列表中的一个对象或装箱的结构。复合格式化功能返回新的结果字符串,其中每个格式项都被列表中相应对象的字符串表示形式取代。

可考虑使用以下 Format 代码段。

C#

复制代码

string myName = "Fred";
String.Format("Name = {0}, hours = {1:hh}", myName, DateTime.Now);

固定文本为“Name = ”和“, hours = ”。格式项为“{0}”和“{1:hh}”,前者的索引为 0,对应于对象 myName,后者的索引为 1,对应于对象 DateTime.Now

格式项语法

每个格式项都采用下面的形式并包含以下组件:

{ 索引[,对齐][:格式字符串]}

必须使用成对的大括号(“{”和“}”)。

索引组件

强制“索引”组件(也叫参数说明符)是一个从 0 开始的数字,可标识对象列表中对应的项。也就是说,参数说明符为 0 的格式项格式化列表中的第一个对象,参数说明符为 1 的格式项格式化列表中的第二个对象,依次类推。

通过指定相同的参数说明符,多个格式项可以引用对象列表中的同一个元素。例如,通过指定类似于“{0:X} {0:E} {0:N}”的复合格式字符串,可以将同一个数值格式化为十六进制、科学记数法和数字格式。

每个格式项都可以引用列表中的任一对象。例如,如果有三个对象,则可以通过指定类似于“{1} {0} {2}”的复合格式字符串来格式化第二、第一和第三个对象。格式项未引用的对象会被忽略。如果参数说明符指定了超出对象列表范围的项,将导致运行时异常。

对齐组件

可选的“对齐”组件是一个带符号的整数,指示首选的格式化字段宽度。如果“对齐”值小于格式化字符串的长度,“对齐”会被忽略,并且使用格式化字符串的长度作为字段宽度。如果“对齐”为正数,字段中的格式化数据为右对齐;如果“对齐”为负数,字段中的格式化数据为左对齐。如果需要填充,则使用空白。如果指定“对齐”,就需要使用逗号。

格式字符串组件

可选的“格式字符串”组件是适合正在格式化的对象类型的格式字符串。如果相应对象是数值,则指定数字格式字符串,如果相应对象是 DateTime 对象,则指定日期和时间格式字符串,或者如果相应对象是枚举值,则指定枚举格式字符串。如果不指定“格式字符串”,则对数字、日期和时间或者枚举类型使用常规(“G”)格式说明符。如果指定“格式说明符”,需要使用冒号。

转义大括号

左大括号和右大括号被解释为格式项的开始和结束。因此,必须使用转义序列显示文本左大括号或右大括号。在固定文本中指定两个左大括号 ("{{") 以显示一个左大括号 ("{"),或指定两个右大括号 ("}}") 以显示一个右大括号 ("}")。按照在格式项中遇到大括号的顺序依次解释它们。不支持解释嵌套的大括号。

解释转义大括号的方式会导致意外的结果。例如,考虑要显示一个左大括号、一个格式化为十进制数的数值和一个右大括号的格式项“{{{0:D}}}”。但是,实际是按照以下方式解释该格式项:

  1. 前两个左大括号 ("{{") 被转义,生成一个左大括号。

  2. 之后的三个字符 ("{0:") 被解释为格式项的开始。

  3. 下一个字符 ("D") 将被解释为 Decimal 标准数值格式说明符,但后面的两个转义大括号 ("}}") 生成单个大括号。由于得到的字符串 ("D}") 不是标准数值格式说明符号,所以得到的字符串会被解释为用于显示字符串“D}”的自定义格式字符串。

  4. 最后一个大括号 ("}") 被解释为格式项的结束。

  5. 显示的最终结果是字符串“{D}”。不会显示本来要格式化的数值。

在编写代码时,避免错误解释转义大括号和格式项的一种方法是单独格式化大括号和格式项。也就是说,在第一个格式化操作中显示文本左大括号,在下一操作中显示格式项的结果,然后在最后一个操作中显示文本右大括号。

处理顺序

如果要格式化的值是 null(在 Visual Basic 中为 Nothing),则返回空字符串 ("")。

如果要格式化的类型实现 ICustomFormatter 接口,则调用 ICustomFormatter.Format 方法。

如果前面的步骤未格式化类型,并且该类型实现 IFormattable 接口,则调用 IFormattable.ToString 方法。

如果前面的步骤未格式化类型,则调用该类型的 ToString 方法(从 Object 类继承而来)。

前面的步骤执行完毕之后应用对齐。

代码示例

下面的示例显示使用复合格式化创建的一个字符串和使用对象的 ToString 方法创建的另一个字符串。两种格式化类型产生相同的结果。

C#

复制代码

string FormatString1 = String.Format("{0:dddd MMMM}", DateTime.Now);
string FormatString2 = DateTime.Now.ToString("dddd MMMM");

假定当前日期是五月的星期四,在美国英语区域性中上述示例中的两个字符串的值都是 Thursday May

Console.WriteLineString.Format 公开相同功能。两种方法的唯一差异是 String.Format 将其结果作为字符串返回,而 Console.WriteLine 将结果写入与 Console 对象关联的输出流。下面的示例使用 Console.WriteLine 方法将 MyInt 的值格式化为货币值。

C#

复制代码

int MyInt = 100;
Console.WriteLine("{0:C}", MyInt);

此代码在当前区域性为美国英语的计算机上,将 $100.00 显示到控制台。

下面的示例说明格式化多个对象,包括用两种不同的方式格式化一个对象。

C#

复制代码

string myName = "Fred";
String.Format("Name = {0}, hours = {1:hh}, minutes = {1:mm}",
      myName, DateTime.Now);

以上字符串的输出是“Name = Fred, hours = 07, minutes = 23”,其中当前的时间反映了这些数字。

下列示例说明了对齐在格式化中的使用。格式化的参数放置在竖线字符 (|) 之间以突出显示得到的对齐。

C#

复制代码

string myFName = "Fred";
string myLName = "Opals";
int myInt = 100;
string FormatFName = String.Format("First Name = |{0,10}|", myFName);
string FormatLName = String.Format("Last Name = |{0,10}|", myLName);
string FormatPrice = String.Format("Price = |{0,10:C}|", myInt); 
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
Console.WriteLine(FormatPrice);

FormatFName = String.Format("First Name = |{0,-10}|", myFName);
FormatLName = String.Format("Last Name = |{0,-10}|", myLName);
FormatPrice = String.Format("Price = |{0,-10:C}|", myInt);
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
Console.WriteLine(FormatPrice);

在美国英语区域性中,上述代码将下列内容显示到控制台。不同的区域性显示不同的货币符号和分隔符。

复制代码

First Name = |          Fred|
Last Name = |         Opals|
Price = |           $100.00|
First Name = |Fred      |
Last Name = |Opals     |
Price = |$100.00   |

相关文章:

  • BZOJ 2337 XOR和路径(高斯消元)
  • Adas术语简称
  • extern c 谈
  • 转载 一堂价值39万元的课,把她看完,你一定会有所获!
  • 关于centos联网的问题
  • 第二章 Java内存区域与内存溢出异常
  • java 用进程调用外部命令并获取返回结果
  • 购物狂欢节的背后,是谁在让你在吃土?
  • Hadoop之HDFS中NameNode的工作机制
  • 目录操作常用命令
  • 史上最全的Python开发秘籍,学完这些年薪百万不是问题
  • 设计模式编写表单验证
  • spark hive python依赖第三方包
  • Asp 输出编码为UTF-8格式的XML内容的注意事项
  • [Leetcode] Permutations II
  • [case10]使用RSQL实现端到端的动态查询
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2017届校招提前批面试回顾
  • const let
  • gitlab-ci配置详解(一)
  • Golang-长连接-状态推送
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript学习总结——原型
  • Node项目之评分系统(二)- 数据库设计
  • node学习系列之简单文件上传
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Sublime Text 2/3 绑定Eclipse快捷键
  • tweak 支持第三方库
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue组件定义
  • webgl (原生)基础入门指南【一】
  • 彻底搞懂浏览器Event-loop
  • 排序算法学习笔记
  • 实现简单的正则表达式引擎
  • linux 淘宝开源监控工具tsar
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #define、const、typedef的差别
  • #微信小程序:微信小程序常见的配置传值
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (过滤器)Filter和(监听器)listener
  • (四)linux文件内容查看
  • (转)Google的Objective-C编码规范
  • (转)http协议
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET Core 成都线下面基会拉开序幕
  • .net FrameWork简介,数组,枚举
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET 服务 ServiceController
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况