4.1 字符类Char 的使用
- Char 类概述
C#中的char数据类型:代表单个字符
• char类型,BLC名称System.Char。
• 取值范围对应Unicode字符集
• 占两个字节
- Char 类的使用
tostring 将此实例的值转换为其等效的字符串表示
char类型可以隐式的转换到可以容纳无符号short类型的数值类型
对于其它数值类型,需要显示转换
char a = 'A';
int i = a;
MessageBox.Show(i.ToString());
- 转义字符
-
下面是C#中常见的转义字符
-
\r\n 回车换行
\t 横向跳到下一制表位置
-
\ 反斜线符
-
\b 退格
-
\r 回车
4.2 字符串类String 的使用
A. 字符串的声明及赋值
String 变量名;//申明
在方法或者控件中赋值
变量名=“内容”;
B. 连接多个字符串
a) String.Format
另一个字符串连接方法为 String.Format。 此方法非常适合从少量组件字符串生成字符串的情况。
MessageBox.Show(i.ToString());
string str3 = "熟练的技能出自于无数次的实验\r\n\t-------扩视机器视觉";
MessageBox.Show(str3);//弹窗显示
string str4 = string.Format(str3 + "\r\n\t\t---欣欣");
MessageBox.Show(str4);//弹窗显示
b) StringBuilder
在其他情况下,可能需要将字符串合并在循环中,此时不知道要合并的源字符串的数量,而且源字符串的实际数量可能很大。 StringBuilder 类专门用于此类方案。
使用stringBuilder类,如果容量小于长度的时候,会自动增加容量。
声明stringBuilder类的时候,如果没有指明容量,那么他的容量小于等于16
//******************************** 1、Append(往结尾添加)******************
StringBuilder sb = new StringBuilder("欣欣");
sb.Append("20200522");
MessageBox.Show(sb.ToString());//弹窗显示
//******************************** 2、Insert(插入)******************
sb.Insert(2,"---");//在下标2插入“----”
MessageBox.Show(sb.ToString());//弹窗显示
//******************************** 3、Remove(删除)******************
sb.Remove(2, 3);//从下标二的地方删除3个字符
MessageBox.Show(sb.ToString());//弹窗显示
//******************************** 4、Replace(替换)******************
sb.Replace("---", "+++");//将---替换为+++
MessageBox.Show(sb.ToString());//弹窗显示
C. 比较字符串
函数方法 返回值
string.Compare(字符串1,字符串2) 相等时返回0,前者较大时返回1,后者较大时返回-1
字符串1.CompareTo(字符串2) 相等时返回0,前者较大时返回1,后者较大时返回-1
字符串1.Equals(字符串2) 相等时返回True,否则返回False
string str5 = "欣欣";
string str6 = "安安呐";
MessageBox.Show(string.Compare(str5, str6).ToString());//弹窗显示
MessageBox.Show(str5.CompareTo(str6).ToString());//弹窗显示
MessageBox.Show(str5.Equals(str6).ToString());//弹窗显示
D. 格式化字符串、
a) 格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元)
MessageBox.Show(string.Format("{0:C}", 0.2));//结果为:¥0.20 (英文操作系统结果:$0.20)
MessageBox.Show(string.Format("{0:C1}", 23.15));// 结果为:¥23.2 (截取会自动四舍五入)
MessageBox.Show(string.Format("市场价:{0:C},优惠价{1:C}", 23.15, 19.82));// 格式化多个Object实例
b) 格式化十进制的数字(格式化成固定的位数,位数不能少于未格式化前,只支持整形)
a) string.Format("{0:D3}",23) 结果为:023
b) string.Format("{0:D2}",1223) 结果为:1223,(精度说明符指示结果字符串中所需的最少数字个数。)
c) 用分号隔开的数字,并指定小数点后的位数
a) string.Format("{0:N}", 14200) 结果为:14,200.00 (默认为小数点后面两位)
b) string.Format("{0:N3}", 14200.2458) 结果为:14,200.246 (自动四舍五入)
d) 格式化百分比
a) string.Format("{0:P}", 0.24583) 结果为:24.58% (默认保留百分的两位小数)
b) string.Format("{0:P1}", 0.24583) 结果为:24.6% (自动四舍五入)
e) 零占位符和数字占位符
a) string.Format("{0:0000.00}", 12394.039) 结果为:12394.04
b) string.Format("{0:0000.00}", 194.039) 结果为:0194.04
c) string.Format("{0:###.##}", 12394.039) 结果为:12394.04
d) string.Format("{0:####.#}", 194.039) 结果为:194
下面的这段说明比较难理解,多测试一下实际的应用就可以明白了。
零占位符:
如果格式化的值在格式字符串中出现“0”的位置有一个数字,则此数字被复制到结果字符串中。小数点前最左边的“0”的位置和小数点后最右边的“0”的位置确定总在结果字符串中出现的数字范围。
“00”说明符使得值被舍入到小数点前最近的数字,其中零位总被舍去。
数字占位符:
如果格式化的值在格式字符串中出现“#”的位置有一个数字,则此数字被复制到结果字符串中。否则,结果字符串中的此位置不存储任何值。
请注意,如果“0”不是有效数字,此说明符永不显示“0”字符,即使“0”是字符串中唯一的数字。如果“0”是所显示的数字中的有效数字,则显示“0”字符。
“##”格式字符串使得值被舍入到小数点前最近的数字,其中零总被舍去。
f) 空格占位符
var number = "666";
var str = string.Format("{0,10}", number);
MessageBox.Show("");//将目标字符串格式化成10个字符,原字符左对齐,不足补空格.
var str1 = number.PadLeft(10);
MessageBox.Show("");//一样的效果用String的实例PadLeft方法也能够实现,PadLeft支持填充自定义字符,空格占位符只能用空格.
var str2 = string.Format("{0,-10}", number);
MessageBox.Show("");//将目标字符串格式化成10个字符,原字符右边对齐,不足补空格.
g) 日期格式化
MessageBox.Show(string.Format("{0:d}", System.DateTime.Now)); //结果为:2009 - 3 - 20 (月份位置不是03)
MessageBox.Show(string.Format("{0:D}", System.DateTime.Now));//结果为:2009年3月20日
MessageBox.Show(string.Format("{0:f}", System.DateTime.Now)); //结果为:2009年3月20日 15:37
MessageBox.Show(string.Format("{0:F}", System.DateTime.Now)); //结果为:2009年3月20日 15:37:52
MessageBox.Show(string.Format("{0:g}", System.DateTime.Now));//结果为:2009 - 3 - 20 15:38
MessageBox.Show(string.Format("{0:G}", System.DateTime.Now)); //结果为:2009 - 3 - 20 15:39:27
MessageBox.Show(string.Format("{0:m}", System.DateTime.Now)); //结果为:3月20日
MessageBox.Show(string.Format("{0:t}", System.DateTime.Now));//结果为:15:41
MessageBox.Show(string.Format("{0:T}", System.DateTime.Now)); //结果为:15:41:50
E. 截取字符串
a) 几个经常用到的字符串的截取
取字符串的前i个字符
string str = "123abc456";
int i = 3;
MessageBox.Show(str.Substring(0, i));
MessageBox.Show(str.Remove(i, str.Length - i));//删除3-后面的字符
b) 去掉字符串的前i个字符:
MessageBox.Show(str.Remove(0, i));//删除0-i字符
MessageBox.Show(str.Substring(i));//截取i个字符
c) 从右边开始取i个字符:
MessageBox.Show(str.Substring(str.Length - i));
MessageBox.Show(str.Remove(0, str.Length - i));
d) 从右边开始去掉i个字符:
MessageBox.Show(str.Substring(0, str.Length - i));
MessageBox.Show(str.Remove(str.Length - i, i));
e) 判断字符串中是否有"abc" 有则去掉之
string a = "abc";
Regex r = new Regex(a);
Match m = r.Match(str);
if (m.Success)
{
//第一种方法
MessageBox.Show(str.Replace(a, ""));//将选中的子替换为空
//第二种方法
string str1, str2;
str1 = str.Substring(0, m.Index);//截取前字符
str2 = str.Substring(m.Index + a.Length, str.Length - a.Length - m.Index);//截取后字符
MessageBox.Show(str1 + str2);//拼接字符
}
f) 如果字符串中有"abc"则替换成"ABC"
str=str.Replace("abc","ABC");
F. 分割字符串
a) 普通分割字符串方式
string str = "a,b,c";
string[] arr = str.Split(',');
foreach (string s in arr)
{
MessageBox.Show(s);
}
b) 利用字符串进行分割字符串方式
string str1 = "a字体b字体c字体d字体e";
string strTemp = "字体";
string[] arr1 = Regex.Split(str1, strTemp, RegexOptions.IgnoreCase);
foreach (string s in arr)
{
MessageBox.Show(s);
}
c) 多个字符分割字符串方式
string str2 = "a,b,c@d$e";
char[] charTemp = { ',', '@', '$' };
string[] arr2 = str2.Split(charTemp);
foreach (string s in arr)
{
MessageBox.Show(s);
}
或
string str3 = "a,b,c@d$e";
string[] arr3 = str3.Split(new char[] { ',', '@', '$' });
foreach (string s in arr)
{
MessageBox.Show(s);
}
d) 分割字符串且去除空字符数组方式
string str4 = "a,,,b,c,d,e";
string[] arr4 = str4.Split(',');
foreach (string s in arr)
{
MessageBox.Show(s);
string str5 = "a,,,b,c,d,e";
string[] arr5 = str5.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string s1 in arr5)
{
MessageBox.Show(s1);
}
e) 分割字符串且不区用作分割字符串的字符的大小写方式
string str6 = "bacAdae";
string[] arr6 = Regex.Split(str6, "a", RegexOptions.IgnoreCase);
foreach (string s2 in arr)
{
MessageBox.Show(s2);
}
f) 插入和填充字符串
string str7 = "下载";
string str8 = str7.Insert(0, "用一生");
string str9 = str8.Insert(5, "你");
MessageBox.Show(str9);
// 填充字符串
string str10 = "妹";
string str20 = str10.PadLeft(2, '你');
string str30 = str20.PadRight(3, '的');
MessageBox.Show(str30);
g) 删除字符串
方法1:删除字符串最后一个字符
string s = "扩试机器视觉实训基地";
MessageBox.Show(s.Substring(0, s.Length - 1));//删除字符串最后一个字符 ;
方法1延申:String.Substring (Int32 index) :保留字符串下标index之后的子串;
MessageBox.Show(s.Substring(3 ,2 ));//保留字符串下标index之后的子串 ;
方法2:s=s.Trim();删除头尾部的空格,遇到首个非空格的字符结束;
(1) String.Trim(char myChar):分别从字符串的前面和后面移除能匹配字符myChar字符的字符,直到遍历的第一个不匹配myChar字符集的字符,停止遍历移除操作;
char myChar = '地';
string s2 = s1.Trim(myChar);
MessageBox.Show(s2);
Trim后面的括号内不填字符的话,默认移除空格字符。
(2)String.Trim(char[ ] myChar):分别从字符串的前面和后面移除能匹配字符myChar字符集里的字符,直到遍历的第一个不匹配myChar字符集的字符,停止遍历移除操作;
string s3 = "扩试机器视觉实训基地";
char[] myChar1 = { '扩', '地' };
string s4 = s3.Trim(myChar1);
MessageBox.Show(s4);
(2) String.TrimStart(char[ ] myChar): 去掉字符串头部的字符
MessageBox.Show(s3.TrimStart(myChar1));//去掉字符串头部的字符
同Tirm(),括号内为空时,默认空格字符;
String.TrimEnd(char[ ] myChar):去掉字符串尾部的字符
MessageBox.Show(s3.TrimEnd(myChar1));//去掉字符串尾部的字符
同Tirm(),括号内为空时,默认空格字符;
h) 复制字符串
复制是通过Copy和CopyTo来实现的。
string.Copy(要复制的字符串);
CopyTo(要复制字符的起始位置(从第几个字符开始往后复制(不包括第几个字符)),目标字符数组,目标数组中的开始存放位置,要复制的字符个数);
string s6 = "视觉学院";
char[] myChar2 = { '扩','试','机','器','视','觉','实','训','基','地' };
s6.CopyTo(0, myChar2, 2, 4);
MessageBox.Show("myChar2等于:" + myChar2.ToString());//复制是通过Copy来实现的。
4.3 可变字符串类
- StringBuilder类的定义
StringBuilder 类位于System.Text命名空间下,表示可变字符字符串, 此类不能被继承。使用StringBuilder类每次重新生成新字符串时不是再生成一个新实例,而是直接再原来字符串占用的内存看空间上进行处理,而且它可以动态的分配占用内存空间大小。因此在字符串处理操作比较多的情况下,使用StringBuilder类可以大大提高系统的性能。
- StringBuilder 类的使用
- StringBuilder.Append 的常用方法
Append(UInt32) 向此字符串后面,追加指定的 32 位无符号整数的字符串
Append(Char, Int32) 向此字符串后面,追加指定数量的字符
Append(Char[], Int32, Int32) 向此字符串后面,追加指定字符数组的字符(从指定位置开始,取多少个)
Append(String) 向此字符串后面,追加另外一个字符串
Append(Char[]) 向此字符串后面,追加字符数组
- StringBuilder.AppendFormat 的常用方法
a) 此方法使用 .NET Framework 的复合格式设置功能,将对象的值转换为其文本表示形式,并将该表示形式嵌入到当前 StringBuilder 对象中。
b) AppendFormat(String, Object) 追加复合格式字符串,然后返回的字符串。 每个格式项都替换为一个自变量的字符串表示形式。
c) AppendFormat(String, Object[]) 追加复合格式字符串,然后返回的字符串。 每个格式项都由参数数组中相应参数的字符串表示形式替换。
d) AppendFormat(IFormatProvider, String, Object[]) 追加复合格式字符串,然后返回的字符串。 每个格式项都使用指定的格式提供程序由参数数组中相应参数的字符串表示形式替换。
e) AppendFormat(String, Object, Object) 追加复合格式字符串,然后返回的字符串。 每个格式项都替换为这两个参数中任意一个参数的字符串表示形式。
f) AppendFormat(String, Object, Object, Object) 追加复合格式字符串,然后返回的字符串。 每个格式项都替换为这三个参数中任意一个参数的字符串表示形式。
- StringBuilder.CopyTo 的常用方法
此方法就是,将源字符串中,指定下标开始,复制指定数量字符到目标字符数组里,并指明开始的位置。下面语法的参数sourceIndex是此实例中字符复制的起始位置。dest是要复制字符的数组,而destIndex是目标将复制字符的起始位置。count参数是要复制的字符数。
- 4StringBuilder.Insert 的常用方法
此方法就是,将指定对象的字符串,插入到此实例中的指定字符位置。
a) Insert(Int32, UInt32) 将 32 位无符号整数,变成字符串表示形式,插入到此实例中的指定字符位置。
b) Insert(Int32, String) 在实例中的指定字符位置,插入字符串到此。
c) Insert(Int32, String, Int32) 将指定字符串的一个或更多副本,插入到此实例中的指定字符位置。
d) Insert(Int32, Char) 将指定的 Unicode 字符的字符串,变成字符串表示形式,插入到此实例中的指定位置。
e) Insert(Int32, Char[]) 将指定的 Unicode 字符数组,变成字符串表示形式,插入到此实例中的指定字符位置。
f) Insert(Int32, Char[], Int32, Int32) 将指定的 Unicode 字符子数组,变成字符串表示形式,插入到此实例中的指定字符位置。
g) Insert(Int32, Object) 将对象的字符串表示形式,插入到此实例中的指定字符位置。
- StringBuilder.Remove(Int32, Int32) 的常用方法
此方法就是,将指定范围的字符从此实例中移除。
- StringBuilder.Replace 方法
此方法就是,将此实例中出现的所有指定字符或字符串,替换为其他的指定字符或字符串。
a) Replace(Char, Char) 将此实例中出现的所有指定字符,替换为其他指定字符。
b) Replace(String, String) 将此实例中出现的所有指定字符串,替换为其他指定字符串。
c) Replace(Char, Char, Int32, Int32) 将此实例的子字符串中出现的所有指定字符,替换为其他指定字符。
d) Replace(String, String, Int32, Int32) 将此实例的子字符串中出现的所有指定字符串,替换为其他指定字符串。
- StringBuilder 类与String 类的区别
-
String是不可变类,StringBuilder是可变类。
-
string本身是不可改变的,它只能赋值一次,每一次内容发生改变,都会生成一个新的对象,然后原有的对象引用新的对象,而每一次生成新对象都会对系统性能产生影响,这会降低.NET编译器的工作效率。
-
StringBuilder类则不同,每次操作都是对自身对象进行操作,而不是生成新的对象,其所占空间会随着内容的增加而扩充,这样,在做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。