1.String 类。
String类在System名称空间中定义,它实现了IComparable、IComparable<string>、ICloneable、IEquatable<string>、IConvertible、IEnumerable、IEnumerable<char>和Ienumerable<string>接口。String是一个封闭类(sealed)类,这意味着它不能被继承。String为C#提供字符串处理功能。它是C#内置的string类型的基础,并且是.NET Framework的一部分。
2.String字符串构造函数
2.1 String类定义了许多构造函数,从而允许以各种方式构造字符串。要从一个字符数据创建字符串,可使用下面任何一种构造函数:
public String(char[] chrs)
public String(char[] chrs,int start,int count)
第一种形式构造一个由chrs中字符组成的字符串。第二种形式使用chrs使用从chrs中从start指定的索引值开始的count个字符来构造字符串。
使用下面的构造函数,可以创建包含多次重复的特殊字符的字符串。
public String(char ch ,int count)
其中,ch是要重复的字符,count是重复的次数。
也可以使用下列构造函数之一,根据给定的字符数组指针构造字符串。
public String(char* chrs)
public String(char* chrs,int start,int count)
第一种形式构造一个由chrs指针所指向的字符组成的字符串。其中,若chrs指向一个以null结束的数组,则它的全部内容均被采用。第二种形式使用了chrs所指向的数组中从start指定索引处开始的count字符。由于这些代码都使用了指针,因此只能在不安全代码中使用。
要构造指针指向字节数组的字符串,则可以使用下列构造函数之一:
public String(sbyte* chrs)
public String(sbyte* chrs,int start,int count)
public String(sbyte* chrs,int start,int count,Encoding en)
第一种形式构造了一个由chrs指针所指向的字节组成的字符串。其中,若chrs指向一个以null结束的数组,则该数组的全部内容均采用。第二种形式使用了chrs所指向的数组中从start指向索引处开始的count个字符。第三种形式可以指定字节的编码方式。默认的编码方式是ASCiiEncoding。Encoding类包含在System.Text名称空间。由于这些构造函数中都使用指针,因此只能在不安全代码中使用。
一个字符串直接量会自动创建一个字符串对象。因此,给string类型的对象赋予一个字符串直接量就可以初始化它,如下所示:
string str="a new string";
2.2String类得字段、索引器和属性
string类定义了一个字段,如下所示:
public static readonly string Empty;
Empty表示空字符串,空字符串是一个不包含任何字符的字符串。这与空的String引用(它只是没有引用对象)不同。
string a = string.Empty;
string b = "";
string c = null; //结果:a==b 但是:a!=c;
String定义了一个只读索引器,如下所示:
public char this[int idx]{get;} 使用://char d = b[2];
该索引器允许用户获得指定索引上的字符元素。同数组一样,字符串的索引从零开始。由于String类型的对象是不变的,因此String使用只读索引器是合理的。
另外,String类还定义了一个制度属性:
public int Length{get;}
Length返回字符串中字符的个数。
2.3字符串运算符
String类重载了两个运算符:“==”和“!=”。要测试两个字符串是否相等,应使用“==”运算符。正常情况下,将“==”应用到对象引用时,它判断两个引用是否指向相同的对象。这对于String类型的对象是不同的。当把“==”应用于两个String类型引用时,它比较的是字符串本身内容的相等性。对于“!=”运算符也是这样,比较String类型对象是,它比较的是字符串的内容。但是,对于其他关系运算符,如“<”或“>”,在比较引用时与比较其他类型对象的用法一样。若要判断一个字符串与另一个字符串的大小关系,则需要使用String定义的Compare()方法。
2.4字符串方法
1.比较字符串 :把一个字符串与另一个字符串进行比较可能是最常用的字符串处理操作。它可以对两个字符的全部或部分进行比较,它也能进行区分大小写或忽略大小写的比较。
static void Main(string[] args)
{
string a = "one";
string b = "one";
string c = "ONE";
if (string.Compare(a, b)==0)
Console.WriteLine("the number a is equals b");
if (string.Compare(a, c, true) == 0)
Console.WriteLine("the number a is equals b ignoring case.");
Console.Read();
}
2.StringComparison枚举
代码示例如下:
public static int Compare(string strA, string strB, StringComparison comparisonType);
public static int Compare(string strA, int indexA, string strB, int indexB, int length, StringComparison comparisonType);
对于每一个版本,how参数指定了如何执行str1与str2的比较。how参数的类型StringComparison是一个枚举,表22-2中定义了它的值。通过使用这些值,可以定制比较的方法,使其满足应用程序的特定需要。因此,StringComparison参数的添加扩展了compare()方法的功能。
CurrentCultrue | 使用当前文化设置进行比较 |
CurrentCuleureIgnoreCase | 使用当前的文化设置进行比较,忽略大小写 |
InvariantCulture | 使用一个固定的(全局并且不会改变)文化信息进行比较 |
InvariantCultureIgnoreCase | 使用一个固定的(全局并且不会改变)文化信息进行比较,忽略大小写 |
Ordinal | 使用字符串中字符的序列值进行比较,因此,字典顺序将不起作用并且忽略文化信息 |
OrdinalIgnoreCase | 使用字符串中字符的序列值进行比较。因此,字典序列将不起作用并且忽略文化信息,忽略大小写。 |
带有StringComparison类型参数的Compare()常用来比较一个字符串与不变的文件名或密码。
static void Main(string[] args)
{
string a = "we~23&blx{1}quot;;
string str;
Console.WriteLine("Enter password:");
str = Console.ReadLine();
if (String.Compare(a, str, StringComparison.InvariantCulture) == 0)
Console.WriteLine("Password accepted.");
else
Console.WriteLine("Password invalid.");
Console.Read();
}
3连接字符串
使用string连接字符串有两种方式:一种用“+”。另一种用Concat()方法。形式如下:
public static string Concat(string str1,string str2)
public static string Concat(string str1,string str2,string str3)
public static string Concat(string str1,string str2,string str3,string str4)
public static string Concat(params string[] strs)
Concat()方法的一些版本接受object类型的引用,而不是string的引用。它们获得调用它们对象的字符串标识,并返回这些字符串的合并后的字符串(字符串表示是通过在对象上调用ToString()获得的)。形式如下:
public static string Concat(object str1,object str2)
public static string Concat(object str1,object str2,object str3)
public static string Concat(object str1,object str2,object str3,object str4)
public static string Concat(params object[] strs)
4.搜索字符串
String提供了多个字符串搜索的方法。例如:可以搜索一个子串或一个字符,也可以所搜它们的第一个匹配项或最后一个匹配项。
形式分别如下:
public int IndexOf(char ch)
public int IndexOf(string ch)
public int LastIndex(char ch)
public int LastIndex(string ch)
String提供了两个辅助的搜索方法:IndexOfAny()和LastIndexOfAny()。它们搜索一组字符中与任一指定字符想匹配的第一个字符和最后一个字符。下面是它们的最简单形式:
public int IndexOfAny(char[] a)
public int LaseIndexOfAny(char[] a)
在处理字符串是,常常需要知道一个字符串的开头或结尾是否与某个给定子串匹配。要完成这些任务,需要使用StartWith()方法和EndsWith()方法,其简单形式如下所示:
public bool StartsWith(string str);
public bool EndsWith(string str);
在很多环境中非常有用的字符串搜索方法是Contains(),其一般形式为:
public bool Contains(string str)
该主调字符串包含由str指定的字符串,该方法返回true,否则返回false。
5.拆分和合并字符串
拆分字符串:
public string[] Split(params char[] seps)
public string[] Split(params char[] seps,int count)
第一种形式将主调字符串拆分成多段,并返回一个包含各个子串的数组。用于分隔各个子串的字符由参数seps传递。如果seps为空或指向空字符处,那么使用空格作为分隔符。
在第二种行驶中,仅仅返回count个子串。
Join()的方法的两种形式如下所示:
public static string Join(string sep,string[] strs)
public static string Join(string sep,string[] strs,int start,int count)
Split()方法还有几种附加形式,它们可以接受StringSplitOptions类型的参数。该参数可以控制是否在拆分结果中包含空字符串。下面是Split()的几种形式:
public string[] Split(params char[] seps,StringSplitOptions how);
public string[] Split(string [] seps,StringSplitOptions how);
public string[] Split(params char[] seps,int count,StringSplitOptions how);
public string[] Split(string[] seps,int count,StringSplitOptions how);
前两种形式拆分主调字符串并返回一个包含子串的数组。用于分配每一个子串的字符是通过参数seps传入的。如果seps为空,将使用空格作为分隔符。
在第三和第四种行驶中,最多返回count个子串。对于上面的所有形式,how的值都决定了如何处理两个分隔符相邻时所产生的空字符串。
how的类型为StringSplitOptions枚举,它只定义了两个值:None和RemoveEmptyEntries.如果how为None,那么会在结果中包含空字符串。如果how为RemoveEmptyEntries,就会从结果中删除空字符串。
2.5填充和剪裁字符串
有时,需要从字符串中去掉前导空格和结尾空格。这种类型的操作称为剪裁,通常在命令处理程序会用到该操作。
要劫财字符串,可以使用下列Trim()方法之一:
public string Trim()
public string Trim(params char[] chrs)
第一种形式删除主调字符串中的前导空格和结尾空格。第二种形式则在字符串的开头或结尾删除chrs所指定的字符。在这两种情况下,都将返回结果字符串。
通过在字符串的左边或右边添加字符,可以填充字符串。要在左边填充字符串,使用下面的方法:
public string PadLeft(int len)
public string PadLeft(int len,char ch)
第一种形式在主调字符串的左边添加空格,以使它的总长达到len。第二种形式在主调字符串的左边添加由ch指定的字符,使它的总长达到len。在这两种情况下,都返回结果字符串。如果len小于主调字符串的长度,则返回未经修改的主调字符串的副本。
要在右边填充字符串使用下面的方法,具体使用和在左边填充数据一样。
public string PadRight(int len)
public string PadRight(int len,char ch)
2.6插入、删除和替换
使用Insert()方法可以把一个字符串插入到另一个字符串中,它的声明如下:
Public string Insert(int start,string str);
其中,str将插入主调字符串中由start所指定的索引值位置,并返回结果字符串。
使用Remove()方法可以删除一个字符串中的一部分,声明如下:
public string Remove(int start);
public string Remove(int start,int count);
第一种形式删除字符串中start位置之后的所有字符。第二种形式,从start位置开始删除count个字符。
使用Replace()可以替换一个字符串中的一部分。
2.7改变字母大小写:
public static ToLower()
public static ToUpper()
2.8使用Substring()方法
使用Substring()方法可以截取字符串的一部分。形式如下:
public string Substring(int idx);
public string Substring(int idx,int count);
3.格式化类型
格式化由两个组件控制:格式说明符(format specifier)和格式提供程序。
1. 某个值的字符串表示所采用的形式是通过使用格式说明符来控制的。2.为了处理文化信心和语言的不同,C#使用格式提供程序。格式提供程序定义了格式说明符的的解释方式。格式提供程序是实现IFormatProvider接口来创建的,该接口定义了GetFormat()方法。对于内置的数据类型和.NET Framework中的许多其他类型,C#预定义了格式提供程序。通常,格式化数据时不用指定相应的格式提供程序。
为了格式化数据,需要在支持格式化的方法调用中指定一个格式说明符。
使用WriteLine格式化数据,形式如下:
WriteLine("format string",arg0,arg1,.......,argn)
格式化字符串包含两项内容:常规打印字符和格式命令。
格式命令采用如下基本形式:{argnum,width:fmt}
其中,argnum是要显示的参数编号(从0开始标识)的数量,width制定了字段的最小宽度,而而fmt代表格式说明符。width和fmt都是可选项。因此,在其最简单形式中,格式命令只指示要显示的参数。例如,{0}表示arg0,{1}表示arg1等。
在程序执行过程中,在格式字符串中遇到格式命令时,就替换并显示由argnum指定的相应参数。因此,格式字符串中的格式说明符所在的位置就是显示相应数据的地方。参数编号标识要显示的是哪个字段。
如果给出了fmt,那么使用指定的格式来显示数据。否则,就使用默认格式。如果给出了width,那么使用空格填充输出结果以确保达到最小字段宽度。如果width是正值,则输出结果右对齐。反之,如果width是负值,就把输出结果左对齐。
Console.WriteLine("{0:F2}{0:F3}{0:e},10.12345"); //10.12 10.123 1.012345e+001
3.2数值型数据的格式说明符
说明符 | 格式 | 精度说明符用法 |
C | 货币(价格) | 指定小数点后的位数 |
c | 同C | |
D | 整数形式表示日期(只使用整数) | 数字的最小位数,必须时使用前面加0的方式来填充结果 |
d | 同D | |
E | 科学计数法 | 指定小数部分的位数,默认为6位 |
e | 科学计数法 | 指定小数部分的位数,默认为6位 |
F | 定点计数法 | 指定小数部分的位数 |
f | 同F | |
G | 使用E或F较短的格式 | 见E和F |
g | 使用e或f中较短的格式 | 见e和f |
N | 定点表示法,使用逗号分隔符 | 指定小数部分的位数 |
n | 同N | |
P | 百分比 | 指定小数部分的位数 |
p | 同P | |
R或r | 树枝行数据,使用Parse()可以将它转换为等价的内部格式(这就是所谓的“来回”格式) | 不使用 |
X | 十六进制(使用大写字符A到F) | 数字的最小位数,必要时在前面加0来填充结果 |
x | 十六进制(使用大写字符a到f) | 数字的最小位数,必要时在前面加0来填充结果 |
4.使用String.Format()和ToString()格式化数据
使用String.Format()和ToString()格式化值:
double v = 17688.65849;
double v2 = 0.15;
int x = 21;
string str = string.Format("{0:F2}", v);
Console.WriteLine(str);
str = string.Format("{0:N5}", v);
Console.WriteLine(str);
str = string.Format("{0:e}", v);
Console.WriteLine(str);
str = string.Format("{0:r}", v);
Console.WriteLine(str);
str = string.Format("{0:p}", v2);
Console.WriteLine(str);
str = string.Format("{0:X}", x);
Console.WriteLine(str);
str = string.Format("{0:D12}", x);
Console.WriteLine(str);
str = string.Format("{0:C}", 189.99);
Console.WriteLine(str);
Console.Read();
结果如下:
17688.66
17,688.65849
1.768866e+004
17688.65849
15.00%
15
000000000021
¥189.99
5. 自定义数字格式
自定义格式占位符:创建自定义格式时,通过创建一个所需数据外观的样式来指定格式。因此,要用到下图所示的字符作为占位符。下面依次研究表中的每一个占位符。
占位符 | 含义 |
# | 数组 |
. | 小数点 |
, | 千位分隔符 |
% | 百分号(显示值诚意100后得到的结果) |
0 | 用前面加0或后面加0来填充 |
; | 将描述正值、负值和0值的格式分隔开 |
E0 E+0 E-0 | 科学计数法(e0 e+0 e-0) |
其中,句号“.”指定了小数点的位置。
“#”占位符指定了数字位置。"#"可以出现在小数点的左边或右边,又可以独立出现。当小数点的右侧有一个或多个“#”是,它们将指定要显示的小数的位数。如果有必要,可以对它进行舍入运算。当“#”出现在小数点左侧的时候,它指定的是值整数部分的数字。如果有必要,它的前面将添加0.如果值得整数部分的位数多于“#”的个数,那么显示整个整数部分,不会出现整数部分被裁减的现象。如果没有小数点,那么“#”导致将值四舍五入成整数值。没有意义的0值,如果后面结尾的0,将不显示。然而,这可能有点复杂,因为如果要进行格式化的值为0,那么格式,如##。###根本就不显示内容。要输出0值,应使用“0”占位符。
“0”占位符用于添加一个前导0或结尾0,以保证显示最少位数的数字。可以把它用在小数点的左右两侧。例如:
Console.WriteLine("{0:00##.#00}",21.3); //结果: 0021.300
值包含多为数时将会完整地显示小数点左边部分,而右边的部分则执行四舍五入运算。
可以通过在一列“#”中嵌入逗号“,”的方式来制定一种样式,这样可以在较大的数中插入逗号分节符。如:
Console.Writeline("{0:#,###.#}",3421.3); //结果:3,421.3
另外,不需要对每3位数都指定一个逗号。只需指定一个逗号就会使小数点左边的整数部分每3位插入一个逗号。例如,
Console.WriteLine("{0:#,###.#}",8763421.3);
//结果:8,763,421.3.
逗号还有第二种用法。当它们出现在紧靠小数点左侧位置时,它们骑到比例因子的作用。使得逗号左侧的值除以1000.例如:
Console.WriteLine("{0:#,###,.#}",8763421.3);
//结果:8,763,4
";"是一个分隔符,它允许给正数、负数、和零指定不同的格式。下面给出使用“;”的自定义格式说明符的基本形式:
positive-fmt;negative-fmt;zero-fmt
Console.WriteLine("0:#.##;(#.##);0.00",num);
如果num为正值,那么显示保留两位小数的值。如果num为负值,那么在一朵圆括号中显示保留两位小数的值。如果num为0,那么显示字符串0.00