.NETCore CSharp 中级篇 2-5
本节内容为常见实用类和方法的使用
String.Format
string.format 方法是一个字符串格式化类, 它里面的一些写法是对字符串进行指定格式的转换.
String.Format 方法的几种定义:
String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项.
String.Format (String, Object[]) 将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的文本等效项.
String.Format (IFormatProvider, String, Object[]) 将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的文本等效项. 指定的参数提供区域性特定的格式设置信息.
String.Format (String, Object, Object) 将指定的 String 中的格式项替换为两个指定的 Object 实例的值的文本等效项.
String.Format (String, Object, Object, Object) 将指定的 String 中的格式项替换为三个指定的 Object 实例的值的文本等效项.
看起来挺抽象的, 事实上 string.format 的写法有点类似于我们的正则表达式. 我们着重的讲一下几个非常常用的用法.
数值格式化
字符 | 说明 | 示例 | 输出 |
---|---|---|---|
C | 货币格式化,后接数字为小数点位数 | string.Format("{0:C3}", 2) | 获得当前设置的货币格式,例如$2.000 或¥2.000 |
D | 十进制,后接数字为向前填充 0 至 N 位 | string.Format("{0:D3}", 2) | 002 |
X | 输出对应的十六进制 | string.Format("{0:X000}", 12) | C |
G | 常规输出 | string.Format("{0:G}", 2) | 2 |
N | 用分号隔开的数字 | string.Format("{0:N}", 250000) | 250,000.00 |
自定义 | 自定义输出 | string.Format("{0:000.000}", 12.2) | 012.200 |
值得注意的是, 大括号括起来的是一个占位符,{0:} 表示的是后接参数的第一个,{1:} 则是第二个, 作为一个占位符存在.
占位符
占位符分为以下两种:
零占位符 0: 如果格式化的值在格式字符串中出现 "0" 的位置有一个数字, 则此数字被复制到结果字符串中. 小数点前最左边的 "0" 的位置和小数点后最右边的 "0" 的位置确定总在结果字符串中出现的数字范围.
"00" 说明符使得值被舍入到小数点前最近的数字, 其中零位总被舍去.
数字占位符 #: 如果格式化的值在格式字符串中出现 "#" 的位置有一个数字, 则此数字被复制到结果字符串中. 否则, 结果字符串中的此位置不存储任何值.
请注意, 如果 "0" 不是有效数字, 此说明符永不显示 "0" 字符, 即使 "0" 是字符串中唯一的数字. 如果 "0" 是所显示的数字中的有效数字, 则显示 "0" 字符. "##" 格式字符串使得值被舍入到小数点前最近的数字, 其中零总被舍去.
PS: 空格占位符
- string.Format("{0,-50}", theObj);// 格式化成 50 个字符, 原字符左对齐, 不足则补空格
- string.Format("{0,50}", theObj);// 格式化成 50 个字符, 原字符右对齐, 不足则补空格
例如, 用于固定区域性的自定义格式字符串为 "dddd, dd MMMM yyyy".
时间格式化
格式化时间非常简单, 我们通常描述时间都是年 - 月 - 日 时: 分: 秒就够了, 在 String.Format 类中, 我们取这些描述词的英文首字母作为格式化字符, 例如 1999-05-06 我需要转换成国外常见的时间表达方式 05/06/99, 我们只需要
"1999-05-06".Format("mm/dd/yy");
非常的简单. 我们列举出一个表格详细的阐明常用时间格式化的字符
| 字符 | 说明 | 详情
|:-:|:-:|:-:|
|d | 短日期模式 | 表示由当前 ShortDatePattern 属性定义的自定义 DateTime 格式字符串. 例如, 用于固定区域性的自定义格式字符串为 "MM/dd/yyyy".
| D | 长日期模式 | 表示由当前 LongDatePattern 属性定义的自定义 DateTime 格式字符串. 例如,"dddd, dd MMMM yyyy".
|f | 完整日期 / 时间模式 (短时间)| 表示长日期 (D) 和短时间 (t) 模式的组合, 由空格分隔.
|F | 完整日期 / 时间模式 (长时间)| 表示由当前 FullDateTimePattern 属性定义的自定义 DateTime 格式字符串. 例如, 用于固定区域性的自定义格式字符串为 "dddd, dd MMMM yyyy HH:mm:ss".
|g | 常规日期 / 时间模式 (短时间)| 表示短日期 (d) 和短时间 (t) 模式的组合, 由空格分隔.
|G | 常规日期 / 时间模式 (长时间)| 表示短日期 (d) 和长时间 (T) 模式的组合, 由空格分隔.
|M 或 m | 月日模式 | 表示由当前 MonthDayPattern 属性定义的自定义 DateTime 格式字符串. 例如, 用于固定区域性的自定义格式字符串为 "MMMM dd".
|t | 短时间模式 | 表示由当前 ShortTimePattern 属性定义的自定义 DateTime 格式字符串. 例如, 用于固定区域性的自定义格式字符串为 "HH:mm".
|T | 长时间模式 | 表示由当前 LongTimePattern 属性定义的自定义 DateTime 格式字符串. 例如, 用于固定区域性的自定义格式字符串为 "HH:mm:ss".
|Y 或 y | 年月模式 | 表示由当前 YearMonthPattern 属性定义的自定义 DateTime 格式字符串. 例如, 用于固定区域性的自定义格式字符串为 "yyyy MMMM".
还有一些自定义的方法, 例如我之前举的例子
| 字符 | 说明 | 详情
|:-:|:-:|:-:|
|N 个 d | 将月中日期表示为从 1 至 31 的数字.|N 个 d 则是在时间有效位小于 N 时在前面加 0
|N 个 M | 将月表示为从 1 至 12 的数字.|N 个 d 则是在时间有效位小于 N 时在前面加 0
|N 个 y | 表示年 | N 个 y 则是在时间有效位小于 N 时在前面加 0, 特别的, 1 个 y 也是使用年份后两位进行表示.
|N 个 s | 将秒表示为从 0 至 59 的数字.| 秒表示自前一分钟后经过的整秒数 | N 个 s 则是在时间有效位小于 N 时在前面加 0
|N 个 m | 将分表示为从 0 至 59 的数字.| 分钟表示自前一小时后经过的整分钟数 | N 个 m 则是在时间有效位小于 N 时在前面加 0
|N 个 h | 将时表示为从 0 至 12 的数字.| 自午夜或中午开始对整小时计数 | N 个 h 则是在时间有效位小于 N 时在前面加 0
|N 个 H | 将时表示为从 0 至 24 的数字.| 自午夜或中午开始对整小时计数 | N 个 h 则是在时间有效位小于 N 时在前面加 0
枚举格式字符串
格式字符串
字符 | 说明 |
---|---|
G 或 g | 如有可能,将枚举项显示为字符串值,否则显示当前实例的整数值。如果枚举定义中设置了 Flags 属性,则串联每个有效项的字符串值并将各值用逗号分开。如果未设置 Flags 属性,则将无效值显示为数字项。 |
F 或 f | 如有可能,将枚举项显示为字符串值。如果值可以完全显示为枚举项的总和(即使未提供 Flags 属性),则串联每个有效项的字符串值并将各值用逗号分开。如果值不能完全由枚举项确定,则将值格式化为整数值。 |
D 或 d | 以尽可能短的表示形式将枚举项显示为整数值。 |
X 或 x | 将枚举项显示为十六进制值。按需要将值表示为带有前导零,以确保值的长度最少有八位 |
DateTime
DateTime 是 C# 时间处理的大杀器, 它的效率非常高, 显著的优于其他语言的时间处理, 其中 DateTime 类型重写了 ToString() 方法, 在 DateTime 的 ToString 方法里面, 我们可以轻而易举的使用我们的格式化字符对它进行格式化.
事实上 DateTime 结构并不是我们今天讲的主题, 因为 DateTime 的操作事实上就是我们的 string.Format 操作, 至多我们讲一下 DateTime 和字符串的转换
符合时间格式的字符串转换成 DateTime 结构只需要使用
DateTime.Parse(str);
我们这节主要讲解的是 TimeSpan 时间计算类的使用, 不过在 DateTime 中也有部分函数用于时间计算, 例如
Add 将指定的 TimeSpan 的值加到此实例的值上.
AddDays 将指定的天数加到此实例的值上.
AddHours 将指定的小时数加到此实例的值上.
AddMilliseconds 将指定的毫秒数加到此实例的值上.
AddMinutes 将指定的分钟数加到此实例的值上.
AddMonths 将指定的月份数加到此实例的值上.
AddSeconds 将指定的秒数加到此实例的值上.
AddYears 将指定的年份数加到此实例的值上.
Subtract 从此实例中减去指定的时间或持续时间.
TimeSpan
下面的列表阐明了部分 TimeSpan 的方法
Add: 与另一个 TimeSpan 值相加.
Days: 返回用天数计算的 TimeSpan 值.
Hours: 返回用小时计算的 TimeSpan 值
Milliseconds: 返回用毫秒计算的 TimeSpan 值.
Minutes: 返回用分钟计算的 TimeSpan 值.
Negate: 返回当前实例的相反数.
Seconds: 返回用秒计算的 TimeSpan 值.
Subtract: 从中减去另一个 TimeSpan 值.
Ticks: 返回 TimeSpan 值的 tick 数.
TotalDays: 返回 TimeSpan 值表示的天数.
TotalHours: 返回 TimeSpan 值表示的小时数.
TotalMilliseconds: 返回 TimeSpan 值表示的毫秒数.
TotalMinutes: 返回 TimeSpan 值表示的分钟数.
TotalSeconds: 返回 TimeSpan 值表示的秒数.
StringBuilder
String 对象是不可改变的, 每次使用 System.String 类中的方法之一时, 都要在内存中创建一个新的字符串对象, 这就需要为该新对象分配新的空间. 如果你需要经常操作字符串对象的话, 直接使用 string 进行加减运算是很不划算的做法, 这个时候, 我们需要使用我们的 StringBuilder 类进行操作.
StringBuilder 可以自由扩展大小, 因为 StringBuilder 分配在堆区.
并且 StringBuilder 可以指定其大小, 当指定分配大小之后, 性能就会得到提升. 在达到容量之前, 它不会为其自己重新分配空间. 如果超过指定大小系统会当前大小倍增, 也就 10,15,20. 建议指定大小.
常用的几个方法
- StringBuilder.Append // 将信息追加到当前 StringBuilder 的结尾.
- StringBuilder.AppendFormat // 用带格式文本替换字符串中传递的格式说明符.
- StringBuilder.Insert // 将字符串或对象插入到当前 StringBuilder 对象的指定索引处.
- StringBuilder.Remove // 从当前 StringBuilder 对象中移除指定数量的字符.
- StringBuilder.Replace // 替换指定索引处的指定字符.
值得注意的一件事情是, 对于 C#, 微软对于 String 类型有着特殊的优化, 如果两个字符串内容相同, 那么他们只会被创建一次, 也就是说会指向同一块内存地址, 并且, C# 比较的方法有以下三种
== 它是比较的栈里面的值是否相等 (值比较)
Equals 它比较的是堆里面的值是否相等 (引用地址值比较)
Object.ReferenceEquals(obj1,obj2) 它是比较的是内存地址是否相等
示例:
- StringBuilder MyStringBuilder = new StringBuilder("Hello World!",30);
- MyStringBuilder.Insert(6,"test");
- MyStringBuilder.Append("test");
你只需要记住, 在面对大量字符串的操作处理中, 我们使用 StringBuilder 来提高我们的运算速度.
如果我的文章帮助了您, 请您在 GitHub.NETCoreGuide 项目帮我点一个 star, 在博客园中点一个关注和推荐.
GitHub https://github.com/StevenEco/.NetCoreGuide
BiliBili 主页 https://space.bilibili.com/33311288
WarrenRyan'sBlog https://blog.tity.xyz/
博客园
来源: https://www.cnblogs.com/WarrenRyan/p/11407921.html