VSTO开发入门教程
上QQ阅读APP看书,第一时间看更新

2.2 字符与字符串处理

字符和字符串类型是编程中最常用的数据类型。编程过程中会涉及字符串的提取、拆分等操作。

■2.2.1 字符变量

字符变量的声明格式为:

    char字符变量;

例如,char MyChar ='d'就声明了一个字符变量并赋初值。表达一个字符常量,必须加上单引号,而不是双引号。

字符变量经常用来代表ASCII码表中的字符。上述的'd'转换为整型数就是100, ASCII码表可以用下面的公式产生。

创建一个名为“WindowsFormsApplication20160606”的窗体应用程序,在窗体上放置一个listbox列表框控件,然后在窗体的Load事件中写入如下代码:

    1         private void Form1_Load(object sender, EventArgs e)
    2         {
    3             this.listBox1.Items.Clear();
    4             for (int i = 0; i <= 127; i++)
    5             {
    6                 char a = Convert.ToChar(i);
    7                 this.listBox1.Items.Add(i.ToString() +"\t" +a);
    8             }
    9         }

上述代码把0~127这128个字符的代码值和符号添加到列表框中,运行效果如图2.1所示。

此外,字符变量可以和整型变量直接进行运算。比如下面两行代码,变量j等于650,原因是abc是字符变量,存储了常量A,而A的ASCII码值是65,因此j是65和10的乘积。

    1             char abc='A';
    2             int j = abc * 10;

图2.1 字符变量

■2.2.2 字符串变量

一个字符串变量可以存储一个字符串,而字符串也可以看作是字符组成的数组。例如,下面的代码中m是一个字符串变量,而m[2]则自动转换为一个字符 变量赋给c,那么c将是字符'T'。

    1             string m = "VSTO";
    2             char c =m[2];

使用这个原理,就可以遍历字符串了:

    1         public void遍历字符串中的字符()
    2         {
    3             char c;
    4             string s = "microsoft office";
    5             for (int i = 0; i < s.Length; i++)
    6             {   //遍历字符串中的每一个字符
    7                 c = s[i];
    8                 result += "\n" + c;
    9             }
    10        }

与此对应的VBA代码如下:

    1  Public Sub遍历字符串中的字符()
    2     Dim c As String, s As String
    3     s = "microsoft office"
    4     result = ""
    5     For i = 1 To Len(s)
    6         '遍历字符串中的每一个字符
    7         c = Mid(s, i, 1)
    8         result = result & vbNewLine & c
    9     Next i
    10 End Sub

■2.2.3 转义字符

C#中有一些特殊的转义字符。在代码中,转义字符都以反斜杠开头,如表2.3所示。

表2.3 C#转义字符

假如要在对话框中输出两行文字,一行是Microsoft,另一行是Office,可以使用如下代码:

        MessageBox.Show("Microsoft\rOffi ce");

运行结果如图2.2所示。

在代码中我们可以看到\r是一个转义字符,产生了回车符。再比如我们要输出计算机中的一个路径“F:\VSTO\VSTOBOOK”,直接这样输入代码中会产生错误,因此需要把源字符串中的每一个反斜杠再加一个反斜杠。

图2.2 认识转义字符

        MessageBox.Show("F:\\VSTO\\VSTOBOOK");

与转义字符相反,使用@可以非转义,即原样输出。例如上述输出路径的问题,修改代码为:

        MessageBox.Show(@"F:\VSTO\VSTOBOOK");

也可以输出正确的路径。

当然我们可以想到,下面的这行代码将原样输出\r,而不是换行。

        MessageBox.Show(@"Microsoft\rOffi ce");

在编程的过程中,会经常使用\t分隔水平的数据,使用\r实现换行输出。

窗体上放置一个richtextbox文本框控件,在窗体的Load事件中输入如下代码:

    1             string result="";
    2             result += "山东省\t济南\r";
    3             result += "安徽省\t合肥\r";
    4             result += "黑龙江省\t哈尔滨\r";
    5             result += "内蒙古自治区\t呼和浩特\r";
    6             this.richTextBox1.Text = result;

运行结果如图2.3所示。

图2.3 使用制表符

通过这个示例,我们可以清晰地看到转义字符所起的作用。

■2.2.4 字符串连接

使用+运算符实现多个字符串的连接,如果连接的各个数据都不是字符串,则需要事先使用ToString()方法强制转换为字符串后再连接。

    1             string s1 = "Microsoft";
    2             string s2 = s1 + "Office";

下面的两行代码中,s3是两个浮点数相加的结果转换为字符串,结果显示5.858,而s4是空字符串与两个数字相连,因此输出为2.7183.14。读者仔细思考其原理。

    1             string s3 = (2.718 + 3.14).ToString();
    2             string s4 = "" + 2.718 + 3.14;

■2.2.5 子字符串

在VB或VBA中使用Left、Right以及Mid函数可以提取字符串中的一部分,在C#中可以使用SubString函数达到同样的目的。SubString的用法和VB中的Mid用法非常类似。

    1  string s1 = "Microsoft";
    2  string s5= s1.SubString(3, 4);

上述代码中,提取字符串s1,从第三个字符起连续提取4个,因此字符串s5将会等于“roso”。

C#使用IndexOf函数可以判断字符串中是否包含另一个子字符串。

    1  string s1 = "Microsoft";
    2  int p = s1.IndexOf("so");

上述代码,目的是监测字符串s1中是否包含“so”,返回的结果是5,因为s1中包含这个子字符串,而且位于第5个位置。反之,如果未找到子字符串,则返回-1。

■2.2.6 格式化字符串

String.Format函数的语法为:

        String Format(要输出的字符串,变量列表)

要输出的字符串中,允许使用{数字}这样的占位符,输出时占位符位置用变量列表中相应位置的变量来替换,具体看下面的例子。

    1         public void格式化字符串()
    2         {
    3             string s0="format", s1="micro", s2="soft", s3 ="visual" , s4="studio";
    4             result =String.Format("result is {0} {3} {4}", s0, s1, s2, s3, s4);
    5         }

上面这个例子依次声明并赋值了5个字符串变量。注意第4行代码,依次把5个变量置于Format函数的参数中,要返回的是双引号括起来的部分,遇到{n}就表示该位置用第n个字符串变量代替,因此result返回的结果是:result is format visual studio。

■2.2.7 字符串的替换

C#中使用Replace函数进行字符串的替换。

Replace函数有以下两种用法:

①字符替换。语法格式如下:

    Replace(旧字符,新字符)

②字符串替换。语法格式如下:

    Replace(旧字符串,新字符串)
    1             string s = "Microsoft Office";
    2             string t = s.Replace('o', '%');
    3             string u = s.Replace("oso", "微软公司");

上述代码中,变量t返回“Micr%s%ft Office”,变量u返回“Micr微软公司ft Office”。

■2.2.8 字符串与数组

在编程实际应用中,经常会将一个字符串按照某个特定的符号进行分割。C#可以使用Split函数实现字符串分割。

    1         public void字符串与数组()
    2         {   //字符串转数组;
    3             string source = "micro soft visual studio";
    4             string[] arr = source.Split(' ');
    5             foreach (string v in arr)
    6             { result += v + "\n"; }
    7             //数组转字符串
    8             result += string.Join("+", arr);
    9         }

上述代码中字符串数组arr用来存储使用空格分割开的source元素。反过来,可以使用Join函数把字符串数组的每一个元素用特定的符号连接起来,成为一个新的字符串。

具有同样功能的VBA代码如下:

    1  Public Sub字符串与数组()
    2     '字符串转数组
    3     Dim source As String, arr, v
    4     source = "micro soft visual studio"
    5     arr = Split(source, " ")
    6     For Each v In arr
    7         result = result & v & vbNewLine
    8     Next v
    9
    10     Dim s(1 To 3) As String
    11     s(1) = "excel"
    12     s(2) = "word"
    13     s(3) = "ppt"
    14     result = result & Join(s, "+++")
    15 End Sub