.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,在博客园中点一个关注和推荐。

Github

BiliBili主页

WarrenRyan'sBlog

博客园

.NET Core C#中级篇2-5 常见实用类的更多相关文章

  1. .NET Core C# 中级篇2-7 文件操作

    .NET Core CSharp 中级篇2-7 本节内容为文件操作 简介 文件操作在我们C#里还是比较常见的,例如我们读取Excel.Txt文件的内容,在程序中,这些文件都是以流的方式读取进入我们内存 ...

  2. .NET Core CSharp 中级篇 2-1 装箱与拆箱

    .NET Core CSharp 中级篇 2-1 本节内容为装箱与拆箱 简介 装箱和拆箱是一个相对抽象的概念.你可以想象一下一堆满载货物的大卡车,他是由许多工人将货物集中堆放装入的,对于我们而言在没有 ...

  3. .NET Core CSharp 中级篇 2-2 List,ArrayList和Dictionary

    .NET Core CSharp 中级篇 2-2 本节内容为List,ArrayList,和Dictionary 简介 在此前的文章中我们学习了数组的使用,但是数组有一个很大的问题就是存储空间不足,我 ...

  4. .NET Core CSharp 中级篇2-8 特性标签

    .NET Core CSharp 中级篇2-8 本节内容为特性标签 简介 标签Attribute是一个非常重要的技术,你可以使用Attribute技术优化精简你的代码.特性标签可以运用在程序集,模块, ...

  5. Prism+MaterialDesign+EntityFramework Core+Postgresql WPF开发总结 之 中级篇

    本着每天记录一点成长一点的原则,打算将目前完成的一个WPF项目相关的技术分享出来,供团队学习与总结. 总共分三个部分: 基础篇主要争对C#初学者,巩固C#常用知识点: 中级篇主要争对WPF布局与Mat ...

  6. django-url调度器-中级篇

    在初级篇中,我们接触了: 1.url 的简单编写 2.两种传参的方式 3.捕获的参数总是字符串 4.为视图设置默认参数 …… 在中级篇中将更进一步. 包含其它的URLconfs 当网站非常大的时候,将 ...

  7. 25个增强iOS应用程序性能的提示和技巧(中级篇)(3)

    25个增强iOS应用程序性能的提示和技巧(中级篇)(3) 2013-04-16 14:42 破船之家 beyondvincent 字号:T | T 本文收集了25个关于可以提升程序性能的提示和技巧,分 ...

  8. 25个增强iOS应用程序性能的提示和技巧--中级篇

    25个增强iOS应用程序性能的提示和技巧--中级篇 标签: ios性能优化内存管理 2013-12-13 10:55 738人阅读 评论(0) 收藏 举报  分类: IPhone开发高级系列(34)  ...

  9. Kotlin——从无到有系列之中级篇(四):面向对象的特征与类(class)继承详解

    如果您对Kotlin很有兴趣,或者很想学好这门语言,可以关注我的掘金,或者进入我的QQ群大家一起学习.进步. 欢迎各位大佬进群共同研究.探索 QQ群号:497071402 进入正题 在前面的章节中,详 ...

随机推荐

  1. Ubuntu 下载 Eclipse + tomcat 配置

    tomcat下载 去网站下载core中的 tar.gz的文件 下载之后依然转移到/opt文件夹然后进行解压 sudo cp apache-tomcat- /opt sudo tar -zxvf apa ...

  2. list模板题

    题面: 设计一个int类型的动态链表L,L中有一个代表当前位置的光标,支持下列操作: insert(x): 在光标前面插入元素x,插入后光标指向新插入的元素x move(d): 如果d为正数,则光标向 ...

  3. 第一届合天杯河北科技大学网络安全技术大赛 web6 writeup

  4. js - 原生ajax访问后台读取数据并显示在页面上

    1.前台调用ajax访问后台方法,并接收数据 <%@ page contentType="text/html;charset=UTF-8" language="ja ...

  5. 【Kali】kali linux的安装

    资源准备 制作U盘启动盘 准备kali_Linux的分区 禁用快速启动 安装kali_linux 在这篇Blog中笔者将会讲解如何安装kali_linux,kali可以安装到虚拟机上,但这里笔者强烈建 ...

  6. Python(简单图形和文件处理)编程

    Python确实是一门很简洁而且功能有强大的语言,我觉得开始学习很容易理解,说到熟练和精通还是不容易的,还需不断学习. 从最基础的语法学习,有些部分各种语言是相同的,让人很好理解.编程也是从最简单语法 ...

  7. Something wrong with EnCase v8 index search results

    My friend told me that she installed EnCase v8.05 on her workstation which OS version is Win 10. She ...

  8. Mac 10.14.4 编译openjdk1.9源码 及集成clion动态调试

    警告⚠️:本文耗时很长,先做好心理准备:编译openjdk源码需要很大的耐心,因为要踩很多坑,解决很多问题,本人从编译开始到结束用了两天时间,按照本篇教程踩坑会少许:谢谢观看 一.获取openjdk源 ...

  9. tcp四次挥手为什么要等待2MSL

    之前所说了解有两个原因: 1.防止客户端最后一次发给服务器的确认在网络中丢失以至于客户端关闭,而服务端并未关闭,导致资源的浪费. 2.等待最大的2msl可以让本次连接的所有的网络包在链路上消失,以防造 ...

  10. Linux - 查看端口的占用情况、找出并杀死占用进程的方法

    目录 1 lsof查看端口的占用情况 1.1 命令使用示例 1.2 查看某一端口的占用情况 1.3 杀死某个端口的所有进程 2 netstat查看端口占用情况 2.1 命令使用示例 2.2 查看占用某 ...