- Visual FoxPro程序设计
- 黄玲芳 刘建兰主编
- 4665字
- 2025-02-20 13:33:55
2.4 系统函数
函数是用程序来实现的一种数据运算或转换,每个函数实现某项功能或完成某种运算,充分正确地使用函数可以简化操作和程序,增强数据处理功能。函数往往需要若干个自变量,即运算对象,但是只能有一个结果,我们称为“函数值”或“函数返回值”。
函数调用的一般形式为:
函数名([参数表])
函数名后的括号不能省略,参数表用方括号括起表示可省略,即有些函数不需要参数。
VFP 9.0有系统函数和用户自定义函数,按函数运算、处理对象及结果的数据类型可分为数值函数、字符函数、日期和时间函数、数据类型转换函数和测试函数。
2.4.1 数值函数
数值函数用来执行数值计算,函数的自变量、返回值一般是数值型。
1.求绝对值函数
格式:ABS(<数值型表达式>)
功能:返回数值型表达式的绝对值。
例如,ABS(-99)求-99的绝对值,结果是99。
2.求平方根函数
格式:SQRT(<数值型表达式>)
功能:返回数值型表达式的算术平方根值,数值型表达式的值必须是正数。
例如,SQRT(24+12)求表达式24+12的平方根,结果是6。
3.取整函数
格式1:INT(<数值型表达式>)
功能:取数值型表达式的整数部分。
格式2:CEILING(<数值型表达式>)
功能:取大于或等于指定表达式的最小整数。
格式3:FLOOR(<数值型表达式>)
功能:取小于或等于指定表达式的最大整数。
例如,在命令窗口中输入如下命令:
?INT(45.47) &&结果为:45 ?CEILING(45.47) &&结果为:46 ?FLOOR(45.47) &&结果为:45 ?INT(-45.47) &&结果为:-45
?CEILING(-45.47) &&结果为:-45 ?FLOOR(-45.47) &&结果为:-46
4.求余数函数
格式:MOD(<数值表达式1>, <数值表达式2> )
功能:返回数值表达式1除以数值表达式2所得的余数,余数符号和数值表达式2相同。当数值表达式1和数值表达式2同号,函数值为两数相除的余数;当数值表达式1和数值表达式2为异号时,函数值为两数相除的余数加上除数。
例如,在命令窗口中输入如下命令:
?MOD(17,4) &&结果为:1 ?MOD(-17, -4) &&结果为:-1 ?MOD(-17,4) &&结果为:3 ?MOD(17, -4) &&结果为:-3
5.求最大值函数和最小值函数
格式:MAX(<表达式1>, <表达式2>, ……, <表达式n>) MIN(<表达式1>, <表达式2>, ……, <表达式n>)
功能:MAX函数是求n个表达式中的最大值,MIN函数是求n个表达式中的最小值。
说明:〈表达式表〉各表达式应是相同数据类型(N、C、Y、D、T)的表达式。
例如,在命令窗口中输入如下命令:
?MAX(146,90,75) &&结果为:146 ?MIN("cbef", "cbare") &&结果为:cbare
6.四舍五入函数
格式:ROUND(<数值表达式1>, <数值表达式2>)
功能:对数值表达式1进行四舍五入,数值表达式2表示保留的小数位数。
说明:如果数值表达式2的值为非负,表示需保留的十进制小数位;如果数值表达式2的值为负,其绝对值表示整数部分四舍五入的位数;如果数值表达式2的值为非整数,则对其取整后四舍五入。
例如,在命令窗口中输入如下命令:
?ROUND(11.356,2) &&结果为:11.36 ?ROUND(26785.67, -1) &&结果为:26790
7.求指数函数
格式:EXP(<数值表达式>)
功能:将数值表达式的值作为指数x求ex的值。
8.求对数函数
格式:LOG(<数值表达式>)
功能:求数值表达式的自然对数,数值表达式必须为正数。
格式2:LOG10(<数值表达式>)
功能:求数值表达式的常用对数,数值表达式必须为正数。
9. π函数
格式:PI( )
功能:返回圆周率π的近似值,小数位数取决于系统设置。
10.随机函数
格式:RAND( )
功能:返回0和1之间的一个随机数。
2.4.2 字符函数
字符函数是处理字符型数据的函数,其自变量或函数值中至少有一个是字符型数据。
1.求字符串长度函数
格式:LEN(<字符表达式>)
功能:返回字符表达式所包含的字符的个数,函数值是数值型。
例如,在命令窗口中输入如下命令:
?LEN("") &&结果为:0 ?LEN("hujjlm") &&结果为:6 ?LEN("计算机应用") &&结果为:10
2.取左子串函数
格式:LEFT(<字符表达式〉, <数值表达式>)
功能:在字符表达式中从左端开始截取数值表达式中指定的字符个数组成新字符串。例如,在命令窗口中输入如下命令:
?LEFT("计算机应用",4) &&结果为:计算
3.取右子串函数
格式:RIGHT(<字符表达式>, <数值表达式>)
功能:在字符表达式中从右端开始截取数值表达式中指定的字符个数组成新字符串。
例如,在命令窗口中输入如下命令:
?RIGHT("计算机应用",4) &&结果为:应用
4.取子串函数
格式:SUBSTR(<字符表达式>, <数值表达式1>[, <数值表达式2>])
功能:从字符表达式中数值表达式1指定的字符位置开始截取数值表达式2指定的字符个数组成新字符串。
例如,在命令窗口中输入如下命令:
?SUBSTR("计算机应用基础",7,4) &&结果为:应用
5.求子串位置函数
格式:AT(<字符表达式1>, <字符表达式2>)
功能:返回字符表达式1在字符表达式2中的起始位置,若字符表达式1不在字符表达式2中,则返回数值0。
例如,在命令窗口中输入如下命令:
?at("windows", "计算机windows系统") &&结果为:7 ?at("windows", "计算机Windows系统") &&结果为:0
6.删除字符串前后空格函数
格式1:LTRIM(<字符表达式>)
功能:去除字符表达式的前导空格。
格式2:RTRIM(<字符表达式>)
功能:去除字符表达式的尾部空格。
格式3:ALLTRIM(<字符表达式>)
功能:去除字符表达式的前导空格与尾部空格。
例如,在命令窗口中输入如下命令:
?LTRIM(" 计算机 ") &结& 果为:计算机□□□ ?RTRIM(" 计算机 ") &结& 果为:□□□计算机 ?ALLTRIM(" 计算机 ") &&结果为:计算机
7.产生空格函数
格式:SPACE(<数值表达式>)
功能:生成若干个空格,空格数由数值表达式的值确定。
例如,在命令窗口中输入如下命令:
gz=SPACE(15) ?LEN(gz) &&结果为:15
8.大小写字母转换函数
格式1:UPPER(<字符表达式>)
功能:将字符表达式中的小写字母转换成大写字母。
格式2:LOWER(<字符表达式>)
功能:将字符表达式中的大写字母转换成小写字母。
例如,在命令窗口中输入如下命令:
?UPPER("computer") &&结果为:COMPUTER ?LOWER("ViSual") &&结果为:visual
9.宏替换函数&
格式:&<字符型内存变量>[.<字符表达式>]
功能:替换一个字符型内存变量中的字符。
说明如下。
(1)如果字符型内存变量与后面的字符表达式无空格分界,则用“.”将&函数与后面的字符表达式分隔开。
(2)宏替换函数取代的字符串本身也可以包含&函数,实现宏替换的嵌套。
例如,在命令窗口中输入如下命令:
a="ABS(-4)*2" ?&a+48 &&结果为:56
10.字符串替换函数
格式:STUFF(<字符型表达式1>, <数值型表达式1>, <数值型表达式2>, <字符型表达式2>)
功能:在字符型表达式1中从数值型表达式1指定位置开始用字符型表达式2替换字符型表达式1中的数值型表达式2指定的字符个数。
例如,在命令窗口中输入如下命令:
x="计算机应用基础" ?STUFF(x,7,4, ’文化’) &&结果为:计算机文化基础
11.字符重复函数
格式:REPLICATE(<字符型表达式>, <数值型表达式>)
功能:重复给定字符若干次,次数由数值型表达式给定。
例如,在命令窗口中输入如下命令:
?REPLICATE("STOP! ",2) &&结果为:STOP! STOP!
2.4.3 日期和时间函数
1.系统日期和时间函数
格式1:DATE()
功能:给出当前系统日期,函数值为日期型。
格式2:TIME()
功能:给出当前系统时间,形式为hh:mm:ss,函数值为字符型。
格式3:DATETIME()
功能:给出当前系统日期和时间,函数值为日期时间型。
2.求年份、月份和天数函数
格式1:YEAR(<日期表达式>|<日期时间表达式>)
功能:从日期表达式或日期时间表达式中求出年份值,函数值为数值型。
格式2:MONTH(<日期表达式>|<日期时间表达式>)
功能:从日期表达式或日期时间表达中求出月份值,函数值为数值型。
格式3:DAY(<日期表达式>|<日期时间表达式>)
功能:从日期表达式或日期时间表达式中求出对应月份中的天数,函数值为数值型。
格式4:CMONTH(<日期表达式>|<日期时间表达式>)
功能:从日期表达式或日期时间表达式中求出对应月份的英文名,函数值为字符型。
例如,在命令窗口中输入如下命令:
?CMONTH({^2018/8/26})+" morning" &&结果为:August morning
3.求时、分和秒函数
格式1:HOUR(<日期时间表达式>)
功能:从日期时间表达式中求出小时数值(按24小时制)。
格式2:MINUTE(<日期时间表达式>)
功能:从日期时间表达式中求出分钟数值。
格式3:SEC(<日期时间表达式>)
功能:从日期时间表达式中求出秒数值。
例如,在命令窗口中输入如下命令:
d={^2018/8/26 06:16:06} ?hour(d), minute(d), sec(d) &&结果为:6 16 6
4.求星期函数
格式:DOW(<日期表达式>|<日期时间表达式>)
功能:从日期表达式或日期时间表达式中求出星期的数值,用1~7表示星期日~星期六,函数值为数值型。
格式:CDOW(<日期表达式>|<日期时间表达式>)
功能:从日期表达式或日期时间表达式中求出星期的英文名。
例如,在命令窗口中输入如下命令:
d={^2018/8/26 06:16:06} ?DOW(d), CDOW(d) &&结果为:1 Sunday
2.4.4 转换函数
转换函数可以将某一数据类型的数据转换成另一种数据类型的数据。
1.将字符转换成ASCII码值函数
格式:ASC(<字符表达式>)
功能:给出字符表达式首字符的ASCII码值。
例如,在命令窗口中输入如下命令:
?ASC("China") &&结果为:67
2.将ASCII码值转换成相应字符函数
格式:CHR(<数值表达式>)
功能:求出以数值表达式的值作为ASCII码时对应的字符。
例如,在命令窗口中输入如下命令:
?CHR(67) &&结果为:C
3.将数值数据转换成字符数据的函数
格式:STR(<数值表达式>[,长度][,小数值])
功能:将数值数据转换成字符数据,长度和小数值分别用来指定结果字符串的长度和四舍五入后保留的小数位数。
说明如下。
(1)小数值省略时,转换后将无小数部分。
(2)长度和小数值都省略时,转换后字符串长度为10,无小数部分。
(3)如果指定的长度小于小数点左边的位数,则返回指定长度个数的星号*,表示出错。
例如,在命令窗口中输入如下命令:
a=-345.65 ?STR(a) &&显示结果为:-346 ?STR(a,7,2) &&显示结果为:-345.65 ?STR(a,8,2) &&显示结果为:-345.65 ?STR(a,6,2) &&显示结果为:-345.7 ?STR(a,2,2) &&显示结果为:**
4.将字符串转换成数值函数
格式:VAL(<字符表达式>)
功能:将由数字、正负号、小数点组成的字符串转换为数值,转换时遇到非上述字符时停止,函数值为0。
说明如下。
(1)前导空格不影响转换。
(2)转换后的数值默认保留两位小数。
例如,在命令窗口中输入如下命令:
?VAL(" -568计算机") &&结果为:-568.00
5.将字符串转换成日期函数
格式:CTOD(<字符表达式>)
功能:将字符型数据转换成日期型数据。
说明:字符表达式中的格式要与系统设置的日期显示格式一致,年份的位数由SET CENTURY命令指定。若字符表达式中的格式与系统设置的日期显示格式不一致,则转换结果为空日期。
例如,在命令窗口中输入如下命令:
SET CENTURY ON SET DATE TO YMD ?CTOD("2018-10-01") &&结果为:2018/10/01 ?CTOD("1-31-2018") &&结果为: / /
6.将日期型转成字符串函数
格式:DTOC(<日期表达式>[,1])
功能:将日期型数据转换成字符型数据,若选参数1,则输出格式为yyyymmdd;若不选参数1,则输出格式为mm/dd/yy。
例如,在命令窗口中输入如下命令:
SET CENTURY OFF SET DATE TO MDY ?DTOC({^2018/9/20}) &&结果为:09/20/18 ?DTOC({^2018/9/20},1) &&结果为:20180920
2.4.5 测试函数
在数据处理时用户经常需要了解操作对象的类型和状态等来决定下一步的动作,VFP 9.0提供了一些测试函数帮助用户准确地获取操作对象的相关信息。
1.数据类型测试函数
格式1:TYPE(<字符表达式>)
功能:计算字符表达式的值并测试计算结果值的数据类型,数据类型用字母代表。
格式2:VARTYPE(<表达式>, [<逻辑表达式>]
功能:测试表达式值的数据类型,数据类型用字母代表。
说明如下。
(1)TYPE函数将字符表达式的定界符去掉后测试其中表达式值的数据类型。
(2)VARTYPE函数直接测试自变量表达式值的数据类型。
(3)在VARTYPE函数中,如果自变量表达式的运算结果是NULL,则根据函数中逻辑表达式的值决定是否返回表达式的类型。如果逻辑表达式为.T.,则返回表达式的原数据类型;如果逻辑表达式为.F.或省略,则返回X,表明表达式的运算结果是NULL值。
例如,在命令窗口中输入如下命令:
a=50 ?TYPE("a+50") &&结果为:N ?VARTYPE("a+50") &&结果为:C ?VARTYPE(a+50) &&结果为:N
两种格式的数据类型测试函数得到的返回值如表2-5所示。
表2-5 两种格式数据类型的测试函数得到的返回值

2.表的测试函数
(1)表文件尾测试函数。
格式:EOF([<工作区号>|<表别名>])
功能:判断指定或当前工作区的记录指针是否指向打开的文件尾,若记录指针指向表中最后一个记录之后,函数返回值为.T.;否则为.F.。
说明:当未写<工作区号>和<表别名>时,默认为当前工作区。
(2)表文件首测试函数。
格式:BOF([<工作区号>|<表别名>])
功能:判断指定或当前工作区的记录指针是否指向打开的文件头,若记录指针指向表中首记录的前面,函数返回值为.T.;否则为.F.。
说明:当未写<工作区号>和<表别名>时,默认为当前工作区。
(3)记录号测试函数。
格式:RECNO([<工作区号>|<表别名>])
功能:判断指定或当前工作区的记录指针所指向记录的记录号。
说明如下。
● 省略参数时,默认为当前工作区。
● 若记录指针在最后一个记录之后,返回比记录总数大1的值。
● 若表中无记录或BOF()函数值为.T.时,该函数返回值均为1。
(4)记录个数测试函数。
格式:RECCOUNT([<工作区号>|<表别名>])
功能:返回当前或指定表中记录的个数。
说明如下。
● 省略参数时,默认为当前工作区。
● 返回值不受SET DELETED和SET FILTER命令的影响。
(5)查找是否成功测试函数。
格式:FOUND([<工作区号>|<表别名>]
功能:在当前或指定表中测试是否找到所需的数据,若找到,返回.T.;否则返回.F.。
说明:当未写<工作区号>和<表别名>时,默认为当前工作区。
(6)记录删除测试函数。
格式:DELETED([<工作区号>|<表别名>])
功能:在当前或指定表中,测试记录指针所指向的记录是否有删除标记,若有,返回.T.;否则返回.F.。
说明:当未写<工作区号>和<表别名>时,默认为当前工作区。
3.文件测试函数
格式:FILE(<文件名>)
功能:判断指定文件是否存在,若文件存在,返回T.;否则返回.F.。
4.条件测试函数
格式:IIF(<条件>, <表达式1>, <表达式2>)
功能:当条件为.T.,返回表达式1的值;否则返回表达式2的值。
例如,在命令窗口中输入如下命令:
?IIF(5>3,6,5) &&结果为:6