.NET Core C#中级篇2-5 常见实用类
.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个m | 将分表示为从 0 至 59 的数字。 | 分钟表示自前一小时后经过的整分钟数 |
| N个h | 将时表示为从 0 至 12 的数字。 | 自午夜或中午开始对整小时计数 |
| N个H | 将时表示为从 0 至 24 的数字。 | 自午夜或中午开始对整小时计数 |
枚举格式字符串
| 字符 | 说明 |
|---|---|
| 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,在博客园中点一个关注和推荐。
.NET Core C#中级篇2-5 常见实用类的更多相关文章
- .NET Core C# 中级篇2-7 文件操作
.NET Core CSharp 中级篇2-7 本节内容为文件操作 简介 文件操作在我们C#里还是比较常见的,例如我们读取Excel.Txt文件的内容,在程序中,这些文件都是以流的方式读取进入我们内存 ...
- .NET Core CSharp 中级篇 2-1 装箱与拆箱
.NET Core CSharp 中级篇 2-1 本节内容为装箱与拆箱 简介 装箱和拆箱是一个相对抽象的概念.你可以想象一下一堆满载货物的大卡车,他是由许多工人将货物集中堆放装入的,对于我们而言在没有 ...
- .NET Core CSharp 中级篇 2-2 List,ArrayList和Dictionary
.NET Core CSharp 中级篇 2-2 本节内容为List,ArrayList,和Dictionary 简介 在此前的文章中我们学习了数组的使用,但是数组有一个很大的问题就是存储空间不足,我 ...
- .NET Core CSharp 中级篇2-8 特性标签
.NET Core CSharp 中级篇2-8 本节内容为特性标签 简介 标签Attribute是一个非常重要的技术,你可以使用Attribute技术优化精简你的代码.特性标签可以运用在程序集,模块, ...
- Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 中级篇
本着每天记录一点成长一点的原则,打算将目前完成的一个WPF项目相关的技术分享出来,供团队学习与总结. 总共分三个部分: 基础篇主要争对C#初学者,巩固C#常用知识点: 中级篇主要争对WPF布局与Mat ...
- django-url调度器-中级篇
在初级篇中,我们接触了: 1.url 的简单编写 2.两种传参的方式 3.捕获的参数总是字符串 4.为视图设置默认参数 …… 在中级篇中将更进一步. 包含其它的URLconfs 当网站非常大的时候,将 ...
- 25个增强iOS应用程序性能的提示和技巧(中级篇)(3)
25个增强iOS应用程序性能的提示和技巧(中级篇)(3) 2013-04-16 14:42 破船之家 beyondvincent 字号:T | T 本文收集了25个关于可以提升程序性能的提示和技巧,分 ...
- 25个增强iOS应用程序性能的提示和技巧--中级篇
25个增强iOS应用程序性能的提示和技巧--中级篇 标签: ios性能优化内存管理 2013-12-13 10:55 738人阅读 评论(0) 收藏 举报 分类: IPhone开发高级系列(34) ...
- Kotlin——从无到有系列之中级篇(四):面向对象的特征与类(class)继承详解
如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索 QQ群号:497071402 进入正题 在前面的章节中,详 ...
随机推荐
- 小白之入口即化——十分钟看懂while循环,字符串格式化,运算符
while循环 while循环-死循环 while空格+条件+冒号 缩进+循环体 3.打断死循环 break--终止当前循环 while True: print(123) print(234) bre ...
- 题解 P5367 【【模板】康托展开】
P5367 [模板]康托展开 感觉这题难度大概在绿题到蓝题之间qwq 一.洛谷日报[yummy]浅谈康托展开 如我想知道321是{1,2,3}中第几个小的数可以这样考虑 : 第一位是3,当第一位的数小 ...
- Linux系统安装jdk——.tar.gz版(old)
这里简单地阐述一下rpm.deb.tar.gz的区别. rpm格式的软件包适用于基于Red Hat发行版的系统,如Red Hat Linux.SUSE.Fedora. deb格式的软件包则是适用于基于 ...
- lnmp php使用命令行去备份数据库
<?php //备份数据库we8和foshan $time = date("Y-m-d",time()); $backtime = date("Y-m-d" ...
- 转 java - java基础知识点
转 https://www.cnblogs.com/xdp-gacl/p/3641769.html 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可 ...
- 逆向MFC程序
目录 @ 1 MFC执行流程 1.1 环境支持 1.2 分析 1.3 实践探索 1.3.1 创建一个MFC程序 1.3.2 下关键断点并调试 1.4 转向MFC库源文件中观测 2 逆向 2.1 特征码 ...
- vue更改了数据但是视图却没有更新
今日总结:让钩子函数背锅的一上午,跪求原谅 需求:页面刷新时,保留当前页面的选中状态 解决思路:在data里设置一下初始值,保证首次进入有默认选中状态,其次再操作时,把选中的状态存sessionSto ...
- 5.源码分析---SOFARPC调用服务
我们这一次来接着上一篇文章<4. 源码分析---SOFARPC服务端暴露>讲一下服务暴露之后被客户端调用之后服务端是怎么返回数据的. 示例我们还是和上篇文章一样使用一样的bolt协议来讲: ...
- 15分钟让你了解如何实现并发中的Barrier
说到Barrier,很多语言中已经是标准库中自带的概念,一般情况下,只需要直接使用就行了.而最近一些机缘巧合的机会,我需要在c++中使用这么个玩意儿.但是c++标准库里还没有这个概念,只有boost里 ...
- word 文档导出 (freemaker+jacob)--java开发
工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂. 学习顺序: 第一阶 ...