1、大学计算机基础教程 TaiYuan University of Technology第9章 处理字符串和日期时间Visual Basic程序设计教程本章主要介绍:字符类型和字符数组操作字符串查找和替换字符串处理日期和时间使用VB的日历控件MonthV i ew在大量的应用系统中,文本是表达和交互数 据的基本类型,而文本的计算机内部表示就 是字符数据类型学会运用V B提供的内部函数,包括比较字符 串和搜索字符串,以及在字符串和其他数据 类型之间的转换等3Visual Basic程序设计教程往往应用程序中需要有日期和时间的相关信息,这就涉及到程序如何表达以及如何使用合适的格式表达程序中对日期时间的
2、处理要求【例9-1】一个简单的 示例程序,把给出的字符 进行加密,然后再解密,程序界面如图所示:5Visual Basic程序设计教程Dim S trl As S tring,S tr2 As S tring Option Compare TextPrivate S ub CmdEncrypt_Click()Dim N As Byte,Count As IntegerText2.Text=N=Len(Textl.Text)For Count=1 To NS trl=Mid(Textl.Text,Count,If(Count Mod 2)=0 ThenText2.Text=Text2.Text&
3、Private S ub FormLoad()Label 1.Caption=请输入:”Label2.Caption=加密后输出:Label3.Caption 二解密后输出Textl.Text=Text2.Text=Text3.Text=”End S ub1)ChrW(AscW(S trl)+2)ElseText2.Text=Text2.Text&ChrW(AscW(S trl)+1)End IfNextEnd S ub6Visual Basic程序设计教程Dim N As Byte,Count As Integer Text3.Text=N=Len(Text2.Text)For Count=
4、1 To NS trl=Mid(Text2.Text,Count,1)If Count Mod 2=0 ThenText3.Text=Text3.Text&ChrW(AscW(S trl)-2)ElseText3.Text=Text3.Text&ChrW(AscW(S trl)-1)End IfNextEnd S ub7Visual Basic程序设计教程本节在小结前述章节的有关字符数据类型的基础 上,进一步介绍有关字符运算、字符数组和实现。各种字符操作和字符转换、类型转换的V B函数。9.3.1字符和字符串1.字符数据类型V B的字符类型数据支持两种格式,一种是定长,另一种 是不定长。如:D
5、im S trl As S tringDim S tr2 As S tring*长度数值在V B中,变长字符串最多可包含大约20亿(2-31)个字符,而定长字符串可包含1到大约64K(216)个字符。V B使用符号和“+”连接字符串形成更大的 字符串。(1)如果连接运算符的两边都是字符型数据,这两个符号都可以使 用。(2)如果把不同类型的数据连接为字符串,使用连接符。建 议使用连接符,可以避免出现类型不匹配的错误。例:S trl=Hell”+“World”S trl中的字符为“Hello World”S trl 二 Hello+2运行时产生,类型不匹配错误,应该使用&代替十9.3.2 比较字符
6、1.使用比较运算符理解一个字符“大于”、“小于”或者“等 于”的含义,是考虑字符在字符表中位置后决 定的。它们按照ASCH码对字符进行排序,然后 比较它们的代码值的大小决定比较结果。Dim S trl As S tring,S tr2 As S tringS trl=A:S tr2=BPrint S trl=S tr2Print S trl S tr2Print S trl “V B6”成立比较结果为False,因为“abc”“V B6”不成立2.S trComp函数函数S trComp用来比较两个字符串,并返回比较 结果。使用格式为:S trComp(S tringl,S tring2,Co
7、mpareType)比较结果的返回值如下:条件S trComp返回值stringl 小于 string2-1stringl 等于 string20stringl 大于 string21stringl 或 string 2为 NullNull13Visual Basic程序设计教程CompareType参数意义如下表所示:常数值描述vbUseCompareOption-1使用Option Compare语句设置执行一个比较vbBinaryCompare0执行一个二进制比较。vbTextCompare1执行一个按照原文的比较。vbDatabaseCompare2仅适用于Microsoft Acce
8、ss,执行一个基于数 据库信息的比较。14Visual Basic程序设计教程9.3.3 String函数和Str函数1.S tring函数使用格式:S tring(Number,Character)函数执行后按创建长度返回重复字符的字符串,其中,Number给出所创建的字符串长度。参数 Character是一个字符(或Ascii码)或字符串表 达式,但只使用它的第一个字符创建新的字符串,如果Character包含了Null就返回Null。例:Dim strl as string,str2 as string,str3S trl=S tring(5,“*)返回 jX jX jX jX QS t
9、r2=S tring(5,42)AS CII码42的字符为*,返回 x|c oS tr3=S tring(10,“ABC”+Null)返回 Null。Visual Basic程序设计教程2.S tr函数函数S tr把一个数值转换为V ariant型。它的使用格式为:S tr(Number)例:(S tring)类S trl=S tr$(123.5)S tr2=S tr(-123.5)Print S trl,S tr2输出123.5,-123.5注意字符串前有一个空格 和符号位9.3.4字符数组字符数组就是数组中的元素都是字符串的数组,使用S tring定义字符数组。有关字符串数组操作 的三个函
10、数如下:1.Join函数Join函数连接某个数组中的多个子字符串而创建 一个新的字符串。函数格式为:Join(List ,Delimiter)其中参数List指出被连接的字符数组 Delimit er是可选参数,在返回字符串中用于 分隔子字符串的字符。默认使用空格来分 隔子字符串。如果Delimiter是零长度字符串,所有元素项都连接在一起,中间没有分隔 符。例如:Dim S trA(2)As S tring,S trl As S tringS trA(O)二欢迎来到S trA(1)二V isual S trA(2)=Basic 6”S trl=Join(S trA)连接字符数组 S trA中
11、三个字符串20 Visual Basic程序设计教程给定一个字符串,可以使用S plit函数创建一个 一维数组,它包含指定数目的子字符串。函数格式Strl ngExDress.Del 1 mi ter.Count.ComDareTvDe1 11)S tringExpress必需参数,字符串表达式。如果表达式的长度为零即为,S plit返回 一个空数组,即没有元素和数据的数组Delimiter可选参数,标识子字符串边界字符。默认空格字符为分隔符。如果该 参数是空字符,则返回数组仅包含一个元素,即S tringExpress字符 串Count可选参数,指定返回的子字符串数,-1表示返回所有的子字符
12、串CompareType可选参数,用数字值表不判别子字符串时使用的比较方式。息义同表9.121Visual Basic程序设计教程【例9-2】使用S plit函数。程序执行后的显示如图 所示。程序代码如下:Private S ub Form_Load()Dim x()As S tringDim y As S tring,n As Integer S howy=Welcome To V isual Basic 6!x=S plit(y)For n=LBound(x)To UBound(x)Print&x(n)NextEnd S ub22Visual Basic程序设计教程3.Filter函数。从
13、一个已知数组中搜索指定的字符串,可以使用Filter函数,ilter函数的格式为:Filter(S tringsArray,V alue,Include,CompareType)S tringsArray必需参数,被执行搜索的一维字符串数组V alue必需参数,要搜索的字符串Include可选参数,Boolean值。True返回的是包含 V alue子字符串的数组子集。False则返回的是 不包含V alue子字符串的数组子集CompareType可选的数字值,表示所使用的比较类型,意 义同表9.123Visual Basic程序设计教程【例93】请从数组A中选出包 括“VB”和不包括“VB”
14、的 元素程序执行后的显示如图所示。Private S ub Form Load()S howDim A(6)As S tring,B()As S tring,C()As S tringA(0)=C:A(l)=V B6:A(2)=C+A(3)二 Jave:A(4)二 V B5:A(5)二MS.NetPrint数组A中所有的字符串元素有:Call Prt(A)B()二 Filter(A,V B)Private S ub Prt(m()As S tring)For n=0 To UBound(m)Print数组A中包含有V B字符的元素有:Call Prt(B)End S ubC()二 Filter
15、(A,V B,False)Print数组A中不包含V B字符的元素有:Call Prt(C)End S ub25Visual Basic程序设计教程本节给出V B处理字符串的常用操作,如取 单个字符、取其中指定的字符、去除字符串中 的空格和转换函数。26Visual Basic程序设计教程9.4.1 Like运算符比较运算符Like用于比较字符串。Like返回一个 逻辑值:True表示被比较的两个字符串相匹配,False表示不匹配。使用格式为:Result 二 S tringl Like PatternV B根据模式匹配可以使用通配符来匹配字符串。也就是说使用Windows中的?、*和#三个匹
16、配 符:?表示任何单一字符,*表示零个或多个字*表示零个或多个字符,#表示任何一个数字(0-9)o例如有S trl=Hello Worldv,则表达式S trl Like“Hello WorldvS trl Like“Hello*”S trl Like“Hello?”返回的结果为都为True。9.4.2使用Mid操作字符串中的字符操作字符串中的单个或者多个字符,一般情况下使用Mid函 数或者Mid语句。关键字Mid在V B中既是函数也是语句。1.Mid函数Mid函数的格式如下:Mid(S tringl,S tart L Length)参数S tringl是被操作的字符串,S tart为一个数字
17、,指示从S tringl中的字符起始位置,Length是可选参数,指示要返回的字符数,如果不指定则从S tart开始往后的 所有字符。例如:Mid(Hello”,2,1)返回字符。2.Mid语句Mid是作为语句使用,Mid出现在赋值号的左边,格式 为:Mid(S tringl,S tart ,Length)=S tring2 用S tr ing2字符串代替S tringl从S tart位置开始的字 符,可选参数Length为替换的长度。注意,字符串 S tring2的长度总是小于等于Length。假设我们已经定 义了MyS tr=V isual Basic,贝Mid(S trl,8)=C+执行
18、的结果使得S trl中的字符串为“V isualC+”(包括后面的两个空格)。9.4.3使用Left、Right和InStr操作字符串1.Left函数使用Left函数选择字符串左边起到指定位置的部分。例如:Strl=Visual Basic”Str2=Left(Str1,6)2.Right函数使用Right函数选择字符串的右边部分。例如:Strl=Visual Basic”Str2=Rightt(Str1,5)3.InS tr函数使用格式为:InS tr(S tart,S tringl,S tring2)可选参数S tart为开始进行搜索的位置,默认为1表示从 头开始。S tringl为基字符
19、串,S tring2为搜索字符串,InS tr在S tringl中搜索是否包含S tring2字符串。返回结 果为数字,0表示没有找到,非0表示返回S tring2在 S tringl中出现的第一个起始位置假设S trl=V isual Basic”,S tr2=Basic,则 执行语句:返回的结果为8,表示“Basic”在“V isual Basic”InS tr(S trl,S tr2)32Visual Basic程序设计教程9.4.4 删除多余的空格使用LTrim、RTrim与Trim函数得到1s字符串的 拷贝,删除前导空格(LTrim).删除尾随空格(RTrim)o Trim函数将两头
20、空格全部去除,但不 删除中间的空格。:Dim MyS tring,TrimS tring MyS tring=V B6 TrimS tring=LTrim(MyS tring)TrimS tring=V B6 TrimS tring=RTrim(MyS tring)TrimS tring=V B6 TrimS tring=Trim(MyS tring)TrimS tring=V B633Visual Basic程序设计教程9.4.5 转换函数1.Asc和Chr函数Asc是取一个字符的AS CH码的函数;Asc函数对单个的字符计算,如果给出的字符多于 一个,它计算第一个字符的AS CH值。例如:
21、Asc(a),得到的值为97Chr是Asc的逆函数,它将一个数值转换为对应的字符,例如 Chr(97)返回的就是字母a。Chr(13)和Chr(10)就分别代表回车 和换行。2.转换大小写函数UCase和LCase分别将字符串的字母转换为大 写或小写。它们的使用方法比较简单:UCase(S tringExpress)LCase(S tringExpress)其中,S tringExpress可以是字符串或者是字符 串表达式。例如S trl=V isual Basic 6“,则:S trResult=UCase(S trl)S trResult=V IS UAL BAS IC 6”S trRes
22、ult=LCase(S trl)S trResult=visual basic 6”3.IsNumbericRV alIsNumeric判断一个字符串是否可以被完整地转换为数字,例如:Print IsNumeric(“123.456)执行后输出为True,Print IsNumeric(123A.456)执行后的输出则为False。其他的判断类型的函数还有IsS trlsArray判断变 量是否为一个数组,IsEmpty函数判断变量是否 已经初始化,IsError函数判断表达式是否为一 个错误值。IsNuH函数判断表达式是否不包含任 何有效数据(Null),IsObject函数判断标示符 是否
23、表示对象变量等,它们返回的都是布尔值。V ai的函数的使用格式为:V ai(S tringExpress)把字符串表达式S tringExpress转换为数字,按以 下规则:(1)如果S tringExpress是由数符组成(包括小 数点),则返回一个转换的数字值。(2)如果S tringExpress中的数符含有空格,忽 略空格。(3)如果S tringExpress含有数字和字母等其他 符号,只转换最前面的数字部分。例:MyV alue=V ai(“2457”),返回 2457。MyV alue=V ai(“2 45 7”)返回 2457。MyV alue=V ai(24 and 57)返
24、回 24。4.Hex和OctHex和Oct是将一个数值型或字符型表达式转换 为十六进制和八进制数。例如:Print Hex(123)Print Oct(123”)分别输出十六进制数7B和八进制数1739.4.6其它类型转换函数函数返回类型Expression参数范围CBoolBoolean任何有效的字符串或数值表达式。CByteByte0 至 255oCCurCurrency-922,337,203,685,477.5808至922,337,203,685,477.5807 0CDateDate任何有效的日期表达式,如#05-12-31#。CDblDouble负数从T.797693134862
25、32E308至-4.94065645841247E-324;正数从4.94065645841247E-324至1.79769313486232E308oCDecDecimal零变比数值,即无小数位的数值为:+/-79,228,162,514,264,337,593,543,950,335。对于 28 位小数的数值,范围则为:+/-7.9228162514264337593543950335;最小的可能非零值是 0.00000000000000000000000000010CIntInteger-32,768至32,767,小数部分四舍五入。CLngLong-2,147,483,648 至 2,
26、147,483,647,小数部分四舍五入。CS ngS ingle负数为-3.402823E38 至-1.401298E-45;正数为 1.401298E-45 至 3.402823E38。CS trS tring依据Expression参数返回CstroCV arV ariant若为数值,则范围与Double相同;若为非数值则范围与S tring相同。40Visual Basic程序设计教程9.4.7 格式化函数FormatFormat函数的使用格式为:Format(Expression,format)其中,表达式Expression可以为任何有效表 达式,而可选参数Format为指定的格式
27、表达式。格式可以是V B预先定义的,也可以是用户定义的。可使用V B预定义名字来指定这些格式,如表9.3 所示。数字格式可以由用户指定,如表9.4所示。格式名总是用双引号括起来。Numl=123456789.34567Print Format(Numl,“Currency”Print Format(0.154,“Percent)Print Format(1,0n/0ff)Format(8315.4,“00000.00”)Format(8315.4,#.#)Format(8315.4,#,#0.00)Format(315.4,$#0.00”)显示123,456,789.35显示15.4%显示On
28、显示08315.40显示8315.4显示8,315.40显示$315,40Visual Basic程序设计教程9.4.8 Len函数和Space函数1.Len函数函数执行后返回一个Long型值,指示字符串内字 符的数目,或是存储一变量所需的字节数。使用 格式为:Len(string|varname)例:dim x as string x=abed”print Ion(x)dim x as integer x=12345显示4443Visual Basic程序设计教程2.S pace函数执行S pace函数返回特定数目空格。使用格式为:S pace(number)其中所必须的number参数为字
29、符串中想要的空格数。例如:Dim MyS tringMyS tring=S pace(10)返回10个空格的字符串。MyS tring=Hello&S pace(10)&World”将10个空格插入两个字符串中间。字处理器中,字符的查找和替换是基本功能。运用 前面介绍过的一些字符处理函数,可以实现对字符 串中的指定的子字符串进行查找和替换操作,例如使 用InS tr,使用Mid函数和Mid语句等。V B还提供了一 个函数Replace实现这个功能。Replace函数返回一个字符串,该字符串中指定的子 字符串已被替换成另一子字符串,并且替换发生的 次数也可以指定。使用格式为:Replace(Ex
30、pression,Find,Replacewith,S tart ,Count)函数参数Expression为字符串表达式,其中包含要被替换的 子字符串。Find是指定要搜索的子字符串,Replacewith用 来替换的子字符串。S tart确定在Express子字符串搜索的 开始位置,默认从1开始。Count为进行替换的次数,默认 是它表明进行所有可能的替换。可以根据Replace函 数的返回值判断查找和替换操作的结果。返回值如表9.5所 示。【例9-4】用一个文本框作为简单的字编辑器,在其中输入一段有关电 脑编程的文字,然后用 查找替换的方法,将文 本框中的“电脑”全部 替换为“计算机”。
31、程序界面如图所示字符查找替换示例让电脑为我们工作,就需要电脑程序。电脑程序是一种特定的代码的有序组合,它使得电脑按照程序设计好的步骤进行工作.许多人协为,编制电脑程序是专业人员 的事情。其实这个看法是非常片面的.无 论你的专业是不是电脑,但一定会和电脑 有关,至少你需要使用它们口通过了解和掌握电脑编程的知识,不但 在使用电脑方面对你有帮助,而且也能够 使得你理解什么是电脑方法.查找替换退出MB、ill澧用狮II【例9-5】使用V B的函数处理日期和时间的示例。Private S ub Form_Load()日期时间|T|nlLabell.CaptionList 1.Additem=V B的日期
32、和时间格式”当前的日期和时间:&NowList 1.AdditemList 1.AdditemList 1.AdditemList 1.AdditemList 1.AdditemList 1.Additem今天是 今天是 今天是 今天是 本月是 今年是&DateVB的日期和时间格式雪箭符百踊的荷痂打宿否得为 下关是:2006-5-19今天是:1 9号今天是:一周的第6天今天是:星期五今天是:5本月是:五月今年是:2006&Day(Date)&号一周的第&Weekday(Date)&天&Weekdayname(Weekday(Date)&Monthname(Month(Date)&Y ear(D
33、ate)End S ub48Visual Basic程序设计教程9.6.1 Date函数和数据类型1.判断Date数据类型Dim Mydate As Date 定义MyDate为日期型变量Mydate=#2005-11-14#给MyDate赋值V B使用IsDate函数指出一个表达式是否可以转换 成日期。使用格式为:IsDate(Expression)参数Expression可以是一个日期表达式或字符串 表达式。函数返回True表示可以实现转换,False表示不能转换。例如:IsDate(#l:01:01 AM#)返回TrueIsDate(1)返回FalseVisual Basic程序设计教程
34、Now函数。返回系统当前的日期与时间。Date函数。返回包含系统日期的Date型数据。Day()函数。返回一月中的某一日。Weekday。函数。返回一个整数,代表某个日期是一 周中的第几天。Weekdayname()函数。返回一个字符串,表示一星期 中的某天。Month。函数。返回一年中1到12之间的某一月。Jear()函数。返回包含表示年份的整数。51Visual Basic程序设计教程3.设置系统日期使用date语句,格式为:Date=NewDate赋值号的右边NewData为新设置的日期数据。例如:Mydate=#2005-11-14#,Date=MydateVisual Basic程序
35、设计教程4.DateS erial 函数执行DateS erial函数将返回包含指定的年、月、日的日期数据。使用格式为:DateS erial(Y ear,Month,Day)5.DateV alue 函数执行Datavalue函数将返回一个日期值,使用格式为:DateV alue(Date)其中参数Date通常是字符串表达式或其他表达式。9.6.2时间数据1.取当前时间取当前时间使用Time函数,使用格式为:Time例如:Print Time输出当前时间到窗体上与时间相关的函数还有Hour(小 时)、Minute(分)、S econd(秒)等。例如要得到当前的时间的小时数,使用如下语句:Pr
36、int Hour(Time)Visual Basic程序设计教程2.设置时间同样我们也可以对机器的时间进行设置,这时 Time关键字位于赋值号的左边。例如直接给时 间赋值:Time=#12:0:0#也可以使用变量给系统时间赋值:My time=#4:35:17 PM#指定一个时间 Time=Mytime3.TimeS erial 函数使用格式为:TimeS erial(Hour,S econd)Minute,函数执行后,返回一个Date型的数据。其中参 数Hour、Minute、S econd分别为时、分、秒,正 常取值范围分别为0(12:00 AM.)23(11:00 PM)、059、0-5
37、9,或者为任何可以被接受的 表达式。例如:TimeS erial(12-6,-15,0)4.TimeV alue 函数TimeV alue函数返回一个包含时间的数据(Date 类型),使用格式为:TimeV alue(Time)其中Time参数通常是一个字符串表达式或其他 表达式,表示 0:00:00(12:00:00 A.M.)到 23:59:59(11:59:59 P.M.)之间的时刻。如果Time包含Null,则返回Nullo日期的计算最直接的方法是通过算术表达式进行 计算。例如下列程序代码给出了当前日前前1天 是哪一天:Dim Datel As DateDatel=Date-100Pr
38、int Datel除了使用算术表达式,V B提供了进行日期计算三 个函数DateAdd、DateDiff和DatePart。9.6.4格式化日期和时间1.FonnatDateTime 函数函数FonnatDateTime将返回t*日期或时间格式 的表达式。使用格式为:FormatDateTime(Date ,NamedFormat)其中参数Date是必需的,它给出要被格式化的日 期表达式。NamedFonnat是可选的,使用数字值 表示日期/时间所使用的格式。常数值描述vbGeneralDate0显示日期和/或时间。日期部分用短日期格式显示,时 间部分用长时间格式显示。如果两部分都有,两部分
39、都显示vbLongDate1用计算机区域设置值中指定的长日期格式显示日期vbS hortDate2用计算机区域设置值中指定的短日期格式显示日期vbLongTime3用计算机区域设置值中指定的时间格式显示时间vbS hortTime4用24小时格式(hh:mm)显示时间即短时间格式60Visual Basic程序设计教程【例9-7】使用FormatDateTime函数给出日期和时 间的不同格式。程序代码如下。Private S ub Form Load()Dim MyDate As DateS howMyDate=FormatDateTime(Now,PrintPrint z/默认的日期时间格式
40、:乐近 回区MyDateFl pl广u广l广十 格闻格洛格咯时期期期间间日的日日时时IA默长短长短:2006-5-19 23:46:26:2006年5月19日:2006-5-19:23:46:26:23:46&Print 长Print 短 vbS hortDate)Print 长Print 短 vbS hortTime)End S ub日期格式:日期格式:时间格式:时间格式:&FormatDateTime(Now,vbLongDate)&FormatDateTime(Now,&FormatDateTime(Now,vbLongTime)&FormatDateTime(Now,61Visual
41、Basic程序设计教程Format(Express,FormatType)其中,Express可以是Date型的数据或表达式,FormatType使用表9.9中的设置值,例如yyyy代表 4位年份,mm代表两位的月份,m使用一位的月份(如果超过一位,如H月12月,按实际输入),使用d表示日,dddd表示星期,hh表示时,nn表 示分,ss表示秒等。也可以使用V B预定义的格式 名(如表9.6所示)。Visual Basic程序设计教程【例9-8】使用Format函数格式化日期和时间的例子。执行程序后的显不如图9.8所不。Private S ub Form_Load()Dim MyDate As
42、 DateS howMyDate=Format(#1/1/2005#,mm/dd/yyyy)程序代码如下。F.2005-1-11-1-05January 1,0501Saturday当前日期2006年5月19日 当前日期为本月的第6周 23:48:4611:48 PM11:59 M12:01 AMPrint Print Print Print Print Print Print Print PrintPrint Print&MyDateFormat(#1/1/2005#,Format(#1/1/2005#,Format(#1/1/2005#,Format(#1/1/2005#,m/d/yy)m
43、mmm d,yy)dd)dddd)当前日期&Format(Now,dddddd)当前日期为本月的第&Format(Now,,zFormat(Now,hh:nn:ss)Format(Now,hh:nn AM/PM)Format(#11:59:59 AM#,hh:ss AM/PM)Format(#12:00:01 AM#,hh:ss AM/PM)w)&周63Visual Basic程序设计教程V B提供了几个日历控件,本节通过一个例子演示日历 控件的使用。【例9-10】从MonthV iew中选 取日期,在文本框中显示。9.7使用VB的日历控件Mont64Visual Basic程序设计教程设计一个简易定时器,界面如图所示。图中文 本框Text 1用来显示开始时间和定时的时间间隔,用单选按钮“时间”和“间隔(分)”确定文本框 中的输入数据是定时的开始时间和定时间隔。使用命令按钮“开始”进入定时过程,“重置”按钮使得定时设置重新开 始。9.8程序举例位进行倒计时,计时归零后通过机器的内部扬声HE.g Lb nt 布友出严日O