C# 字符串操作详解
1、字符串转字符数组
(1)、ToCharArray()方法,源码如下:
调用代码:
var str = "Hello World"; //将字符串转换成字符数组 var result = str.ToCharArray(); var enumerator = result.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }
输出结果:
(2)、源码如下:
调用代码如下:
var str = "Hello World"; //将字符串转换成字符数组 var result = str.ToCharArray(2,2); var enumerator = result.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); }
输出结果:
(3)、源码如下:
作用:清空字符串前后的空格
调用代码如下:
var str = " Hello World "; //调用trim方法去除前后的空格 var result = str.Trim(); Console.WriteLine("str的原长度:{0},str调用Trim()方法之后的长度{1},结果字符串:{2}",str.Length,result.Length, "$"+ result + "$");
(4)、源码如下:
调用代码如下:
var str = " Hello World "; //str调用trim方法的代码执行过程 //1、str处理开头的字母部分,str开头的首字母是空格,然后检索传入的参数是否有空格,有就清除开头所有的空格,并执行下一个字母的判断 //下一个字母如果传入的参数当中有则清除字符串中的改该字母(连续则清除所有连续的),没有就不在对字符串的开头进行操作 //注:整个过程以字符串为主,如果调用trim方法的字符串中的字符,在传入参数中没有,那么整个过程中段. //2、str处理末尾的字母部分,str末尾的字母是空格,然后检索传入的参数是否有空格,有就清除末尾所有的空格,并执行下一个字母的判断,没有就不在对字符串的末尾进行操作 //下一个字母如果传入的参数当中有则清除字符串中的改该字母(连续则清除所有连续的),没有就不在对字符串的开头进行操作 //注:整个过程以字符串为主,如果调用trim方法的字符串中的字符,在传入参数中没有,那么整个过程中段. var result = str.Trim(' ', 'd', 'H', 'r', 'e'); Console.WriteLine("str的原长度:{0},str调用Trim()方法之后的长度{1},结果字符串:{2}", str.Length, result.Length, "$" + result + "$"); Console.ReadKey();
(5)、源码如下:
var str = " Hello World "; //1、str处理末尾的字母部分,str末尾的字母是空格,然后检索传入的参数是否有空格,有就清除末尾所有的空格,并执行下一个字母的判断,没有就不在对字符串的末尾进行操作 //下一个字母如果传入的参数当中有则清除字符串中的改该字母(连续则清除所有连续的),没有就不在对字符串的开头进行操作
//输出:"$ Hello Worl$" var result = str.TrimEnd(' ', 'o', 'd', 'r', 'o'); //1、str处理末尾的字母部分,str末尾的字母是空格,然后检索传入的参数是否有空格,有就清除末尾所有的空格,并执行下一个字母的判断,没有就不在对字符串的末尾进行操作 //下一个字母如果传入的参数当中有则清除字符串中的改该字母(连续则清除所有连续的),没有就不在对字符串的开头进行操作 //输出:"$ Hello W$" var result2 = str.TrimEnd(' ', 'd', 'l', 'r', 'o'); Console.WriteLine("$" + result + "$"); Console.WriteLine("$" + result2 + "$");
(6)、源码如下:
(5)的反例,处理字符串的开头.
(7)、源码如下:
参数:value-目标字符串 comparisonType-比较类型
作用:判断传入的字符串是不是当前字符串的开头,可设置比较类型(二进制比较、忽略语言文化比较、按当前线程的语言文化比较)
调用代码如下:
var str = "Hello World"; //判断str字符串是不是以"Hello"字符串开头,"Hello"字符串和"Hello World"字符串的比较方式位二进制比较, //是速度最快的一种,但前提是字符串不能是展示给用户看的信息 //输出:True var result = str.StartsWith("Hello",StringComparison.Ordinal); //判断str字符串是不是以"Hello"字符串开头,"Hello"字符串和"Hello World"字符串的比较方式为采用当前线程设置的语言文化,并忽略大小写的比较方式 var result1 = str.StartsWith("Hello", StringComparison.CurrentCultureIgnoreCase); Console.WriteLine(result+"...."+ result1);//输出:True....True
(8)、源码如下:
参数:value-目标字符串 ignorecase-是否忽略大小写 culture-语言文化
var str = "Hello World"; //判断str字符串是不是以"Hello"字符串开头,"Hello"字符串和"Hello World"字符串的比较方式为当前线程的语言文化为背景的情况下忽略大小写的方式 //输出:True var result = str.StartsWith("Hello",true,Thread.CurrentThread.CurrentCulture); //判断str字符串是不是以"Hello"字符串开头,"Hello"字符串和"Hello World"字符串的比较方式为以中文(zh-CN代表中文0)为背景的情况下不忽略大小写的方式 //输出:True var result1 = str.StartsWith("Hello", false, new System.Globalization.CultureInfo("zh-CN")); Console.WriteLine(result+"...."+ result1);//输出:True....True
在介绍Split前,介绍一个枚举,设置Split处理后的字符串数组是否输出空字符串
public enum StringSplitOptions { // // 摘要: // 返回的值包括数组的元素,包含一个空字符串 None = 0, // // 摘要: // 返回值不包括包含空字符串的数组元素 RemoveEmptyEntries = 1 }
(9)、源码如下:
调用代码如下:
var str = "Hello World"; //Split不指定参数,默认按照空格对字符串进行分割 var result = str.Split(); //输出:Hello和World两个单词 var en = result.GetEnumerator(); while (en.MoveNext()) { Console.WriteLine(en.Current); } Console.WriteLine("----------略微复杂的字符串分割-------------"); //先按空格对字符串进行分割,得到Hello和World两个字符串 //在按H对Hello和World进行分割得到空格和ello和World //在按l对上面的三个字符串进行分割得到空格和e和空格和o和Wor和d //在按r对上面的6个字符串进行分割得到空格和e和空格和o和Wo和空格和d var result1 = str.Split(' ','H','l','r'); var en1 = result1.GetEnumerator(); while (en1.MoveNext()) { Console.WriteLine(en1.Current); }
注:如果该方法不给参数,默认按照空格进行分割.
(10)、
参数: separator一指定的分隔符 count一分割产生的子字符串的最大数量
调用代码如下:
string delimStr = " ,.:"; char[] delimiter = delimStr.ToCharArray(); string words = "one two,three:four."; string[] result = default(string[]); for (int i = 1; i <=5; i++) { result = words.Split(delimiter, i); Console.WriteLine("根据指定的分隔符将一个字符串拆分成传入的最大数量的子字符串,当前传入的最大数量为:{0}", i); foreach (var s in result) { Console.WriteLine(s); } } Console.ReadKey();
(11)、
参数: separator一指定的分隔符 count一分割产生的子字符串的最大数量 options一是否要清除结果中的空字符串
调用代码:
var str = "Hello World"; var res = str.Split(new char[] { ' ', 'H' }, 3); Console.WriteLine("-----------没有去空格的结果(传入了 StringSplitOptions.None或者不传这个参数(默认这个参数))------------"); foreach (var i in res) { Console.WriteLine(i); } Console.WriteLine("-----------去空格的结果(StringSplitOptions.RemoveEmptyEntries)------------"); var result = str.Split(new char[]{' ','H'}, 3, StringSplitOptions.RemoveEmptyEntries); var en = result.GetEnumerator(); while (en.MoveNext()) { Console.WriteLine(en.Current); } Console.ReadKey();
(12)、
作用:根据传入的字符串数组进行分割,并选择性的清除结果集中的空字符串
var str = "Hello World"; var res = str.Split(new string[] { "o " }, StringSplitOptions.None); Console.WriteLine("-----------没有去空格的结果(传入了 StringSplitOptions.None或者不传这个参数(默认这个参数))------------"); foreach (var i in res) { Console.WriteLine(i); }
(13)、
作用:根据传入的字符串数组进行分割,并选择性的清除结果集中的空字符串,并指定分割产生的最大字符串数.
示例代码和(11)类似
(12)、
作用:连接一个字符串数组.传入一个继承了IEnumerable<string>称之为(可枚举字符串对象)
调用代码如下:
// List<string>继承自IEnumerable<string> var list = new List<string>(); list.Add("1"); list.Add("2"); var result=String.Concat(list); Console.WriteLine(result);
(13)、源码如下:
红框中的代码说明传入的必须是C#基元类型(包括string)的可枚举数组对象,如果是自定义类型,返回的就是类名的和.
作用:将一个基元类型的可枚举数组对象转换成字符串表现形式
var list = new List<double>(); list.Add(11.1); list.Add(12.1); var result= String.Concat<double>(list); var secondList = new List<bool>(); secondList.Add(true); secondList.Add(false); var secondResult = String.Concat<bool>(secondList); Console.WriteLine(result+"...."+ secondResult);
(14)、源码如下:
观察源码发现,其实调用了IndexOf实例方法,并指定字符串的比较方式为二进制比较方式,为最快的比较方式.
作用:判断字符串中是否存在传入参数字符串.
调用代码:
var str = "大学专科"; var result = str.Contains("大专"); var result1 = str.Contains("大学"); Console.WriteLine(result);//输出:False Console.WriteLine(result1);//输出:True
(15)、源码如下:
作用:复制一个字符串变量值到另一个字符串变量
调用代码如下:
var str = "abc"; var str1 = "xyz"; Console.WriteLine("------------下面通过Copy方法赋值--------------"); str1 = String.Copy(str); Console.WriteLine("str 和 str1 {0} 同一个引用地址.",ReferenceEquals(str,str1)?"是": "不是"); Console.WriteLine("str的值和str1的值{0}相等.", string.Equals(str, str1, StringComparison.Ordinal) ? "" : "不"); Console.WriteLine(); Console.WriteLine("------------下面通过引用赋值--------------"); str1 = str; Console.WriteLine("str 和 str1 {0} 同一个引用地址.", ReferenceEquals(str, str1) ? "是" : "不是"); Console.WriteLine("str的值和str1的值{0}相等.", string.Equals(str, str1, StringComparison.Ordinal) ? "" : "不");
(16)、
参数说明:
sourceIndex - 要复制的此实例中第一个字符的索引
destination - 此实例中的字符所复制到的 Unicode 字符数组
destinationIndex - destination 中的索引,在此处开始复制操作。
count - 此实例中要复制到 destination 的字符数。
调用代码如下:
string source = "xiaochao"; char[] destination = {'T','h','e',' ','a','a','a', 'a', 'a', 'a', 'a', 'a',' ','i','s',' ','m','v','p'}; //从source的索引为0的地方法开始,获取source中source长度个字符,将获取的字符从destination中索引为4的地方开始覆盖 source.CopyTo(0, destination, 4, source.Length); Console.WriteLine(destination); source = "I think so!"; //从source的索引为0的地方法开始,获取source中source长度个字符,将获取的字符从destination中索引为4的地方开始覆盖 source.CopyTo(0, destination,4 ,source.Length); Console.WriteLine(destination);
(17)、
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 实例的值的文本等效项。
常用的格式化数值结果表
字符 |
说明 |
示例 |
输出 |
C | 货币 | string.Format("{0:C3}", 2) | $2.000 |
D | 十进制 | string.Format("{0:D3}", 2) | 002 |
E | 科学计数法 | 1.20E+001 | 1.20E+001 |
G | 常规 | string.Format("{0:G}", 2) | 2 |
N | 用分号隔开的数字 | string.Format("{0:N}", 250000) | 250,000.00 |
X | 十六进制 | string.Format("{0:X000}", 12) | C |
string.Format("{0:000.000}", 12.2) | 012.200 |
常用的几种实例
1、字符串的数字格式
string str1 =string.Format("{0:N1}",56789); //result: 56,789.0 string str2 =string.Format("{0:N2}",56789); //result: 56,789.00 string str3 =string.Format("{0:N3}",56789); //result: 56,789.000 string str8 =string.Format("{0:F1}",56789); //result: 56789.0 string str9 =string.Format("{0:F2}",56789); //result: 56789.00 string str11 =(56789 / 100.0).ToString("#.##"); //result: 567.89 string str12 =(56789 / 100).ToString("#.##"); //result: 567
2、格式化货币(跟系统的环境关,中文系统默认格式化人民币,英文系统格式化美元
string.Format("{0:C}",0.2)
结果为:¥0.20 (英文操作系统结果:$0.20)
默认格式化小数点后面保留两位小数,如果需要保留一位或者更多,可以指定位数
string.Format("{0:C1}",23.15)
结果为:¥23.2 (截取会自动四舍五入)
格式化多个Object实例
string.Format("市场价:{0:C},优惠价{1:C}",23.15,19.82)
3、格式化十进制的数字(格式化成固定的位数,位数不能少于未格式化前,只支持整形)
string.Format("{0:D3}",23) //结果为:023 string.Format("{0:D2}",1223) //结果为:1223,(精度说明符指示结果字符串中所需的最少数字个数。)
4、用分号隔开的数字,并指定小数点后的位数
string.Format("{0:N}", 14200) //结果为:14,200.00 (默认为小数点后面两位) string.Format("{0:N3}", 14200.2458) //结果为:14,200.246 (自动四舍五入)
5、格式化百分比
string.Format("{0:P}", 0.24583) //结果为:24.58% (默认保留百分的两位小数) string.Format("{0:P1}", 0.24583) //结果为:24.6% (自动四舍五入)
6、零占位符和数字占位符
string.Format("{0:0000.00}", 12394.039) //结果为:12394.04 string.Format("{0:0000.00}", 194.039) //结果为:0194.04 string.Format("{0:###.##}", 12394.039) //结果为:12394.04 string.Format("{0:####.#}", 194.039) //结果为:194
下面的这段说明比较难理解,多测试一下实际的应用就可以明白了。
零占位符: 如果格式化的值在格式字符串中出现“0”的位置有一个数字,则此数字被复制到结果字符串中。小数点前最左边的“0”的位置和小数点后最右边的“0”的位置确定总在结果字符串中出现的数字范围。 “00”说明符使得值被舍入到小数点前最近的数字,其中零位总被舍去。
数字占位符: 如果格式化的值在格式字符串中出现“#”的位置有一个数字,则此数字被复制到结果字符串中。否则,结果字符串中的此位置不存储任何值。
请注意,如果“0”不是有效数字,此说明符永不显示“0”字符,即使“0”是字符串中唯一的数字。如果“0”是所显示的数字中的有效数字,则显示“0”字符。 “##”格式字符串使得值被舍入到小数点前最近的数字,其中零总被舍去。
7、日期格式化
string.Format("{0:d}",System.DateTime.Now) //结果为:2009-3-20 (月份位置不是03) string.Format("{0:D}",System.DateTime.Now) //结果为:2009年3月20日 string.Format("{0:f}",System.DateTime.Now) //结果为:2009年3月20日 15:37 string.Format("{0:F}",System.DateTime.Now) //结果为:2009年3月20日 15:37:52 string.Format("{0:g}",System.DateTime.Now) //结果为:2009-3-20 15:38 string.Format("{0:G}",System.DateTime.Now) //结果为:2009-3-20 15:39:27 string.Format("{0:m}",System.DateTime.Now) //结果为:3月20日 string.Format("{0:t}",System.DateTime.Now) //结果为:15:41 string.Format("{0:T}",System.DateTime.Now) //结果为:15:41:50
18、
获取指定字符数组中的任意字符在此实例中第一个匹配项的从零开始的索引。
调用代码如下:
char[] chars = { 'a', 'e', 'i', 'o', 'u', 'y','A', 'E', 'I', 'O', 'U', 'Y' }; String s = "The long and winding road..."; Console.WriteLine("chars中的第一个字出现在s中的字符是:{0},出现的位置索引是:{1}",s[s.IndexOfAny(chars)], s.IndexOfAny(chars));
19、
向当前字符串实例的startIndex的位置,插入一段指定的字符串(value)
调用代码如下:
String original = "aaabbb"; Console.WriteLine("原字符串: '{0}'", original); String modified = original.Insert(3, " "); Console.WriteLine("Insert修改后的字符串: '{0}'", modified);
20、
将指定的可枚举基元类型通过传入的分隔字符串进行连接.
调用代码如下:
//将List数组中的元素通过"$$"进行连接 var result=String.Join<int>("$$", new List<int>() { 1, 2, 3, 4, 5, 6 }); Console.WriteLine(result);
21、
作用:向当前实例字符串的左边填充空格,以达到totalWidth长度的字符数,以实现右对齐的功能.
调用代码如下:
String str = "Hello World"; String result = str.PadLeft(20); Console.WriteLine(result);
22、
作用:向当前实例字符串的左边填充指定字符(paddingChar),以达到(totalWidth)长度的字符数,以实现右对齐的功能.
调用代码如下:
String str = "Hello World"; String result = str.PadLeft(20,'$'); Console.WriteLine(result);
注:PaddRight方法就不说了
23、
作用:移除当前字符串实例从startIndex索引开始的,count个字符
调用代码如下:
String str = "Hello World"; //移除空格之后的字符串,输出"Hello" String result = str.Remove(str.IndexOf(' ', 0)); Console.WriteLine(result);
24、
通过传入的分割符,对当前的字符串实例进行分割,返回字符串数组,可以指定最多返回的子字符串数量(通过count参数),可以过滤空子字符串(通过options参数)
调用代码如下:
String str = "1$ $2$3$4$ $5"; //根据"$"对str进行分割,最多返回10个子字符串,并且移除结果集空字符串 str.Split("$".ToCharArray(), 10, StringSplitOptions.RemoveEmptyEntries);
String str = "1$$2$3$4$$5"; //根据"$"对str进行分割,最多返回10个子字符串,并且移除结果集空字符串 var result=str.Split("$".ToCharArray(), 10, StringSplitOptions.RemoveEmptyEntries); var en = result.GetEnumerator(); while (en.MoveNext()) { Console.WriteLine(en.Current); }