角色运算符

按优先顺序只有 4 个字符的运算符:

操作者 描述
() 用于分组的括号。注意:我所拥有的 VFP 文档错过了这个。没有这个, - 运算符几乎总是无用的。
+ 连接(连接)字符串并排。
- 通过尾部空格从左侧字符串移动到右侧字符串的末尾来连接字符串。
$ 检查第二个字符串是否包含第一个字符串。

+是最简单的,也用于连接许多其他语言的字符串。

local firstName, lastName
firstName = "John"
lastName  = "Smith"

? m.firstName + " " + m.lastName

输出:约翰史密斯

- 有点棘手,并不广为人知。它从左侧字符串中获取尾随空格,将这些空格附加到右侧的字符串中。假设你有一个包含名字和姓氏的表,每个表都有 20 个字符。我们想连接姓氏和名字创建一个完整的名字,并且我们也希望所产生的大小是固定的(在这种情况下,20 + 20 + 1 个=空间 41)。让我们让你也有一个中间名列,我们希望全名看起来像“lastName,firstName middleName_______”。最简单的方法是使用 - 运算符,但是你应该注意在这里使用括号进行分组的技巧,所以我们得到了我们想要的结果:

* Create a cursor for our sample and fill in a few names
Create Cursor Names (firstName c(20), midName c(20), lastName c(20))

Insert Into Names (firstName, midName, lastName) Values ('Cetin','', 'Basoz')
Insert Into Names (firstName, midName, lastName) Values ('John', 'M', 'Smith')
Insert Into Names (firstName, midName, lastName) Values ('John', 'F', 'Kennedy')
Insert Into Names (firstName, midName, lastName) Values ('Tom', '', 'Hanks')

* Select with tricky - operator
Select *, ;
    lastName - (', '+firstName-(' '+midName)) As FullName ;
    from Names ;
    INTO Cursor crsNames ;
    nofilter

Browse

而输出是这样的:

名字 midName 全名
切廷 Basoz 巴索兹,切廷
约翰 M 工匠 史密斯,约翰 M.
约翰 F 肯尼迪 肯尼迪,约翰 F.
汤姆 汉克斯 汉克斯,汤姆

在 fullName 列中,所有尾随空格都被很好地推送到最后。如果检查结构,fullName 列的宽度为 63 个字符(我们添加了 3 * 20 + 3 个字符)。

请注意分组括号的重要性(尝试删除括号或以不同方式排列)。

虽然 - 运算符在这种情况下可能很有诱惑力,但硬币还有其他方面。此运算符是特定于 VFP 的,因此 SQL 不可移植。你可以通过此 ANSI 兼容的 SQL 实现相同的结果:

Select *, ;
    CAST(RTRIM(lastName) +', '+ RTRIM(firstName) +' '+ midName as char(63)) As FullName ;
    from Names ;
    INTO Cursor crsNames ;
    nofilter

最后一个运算符是$。它只是检查左弦是否是右弦的一部分。

local upcased, digits, hexDigits
upcased = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
digits  = '0123456789'
hexDigits  = m.digits + 'ABCDEF'

? 'A' $ m.upcased && .T.
? 'a' $ m.upcased && .F.
? '1' $ m.digits && .T.
? 'F' $ m.digits && .F.
? 'F' $ m.hexDigits && .T.

重要提示: 在 VFP 中,尽管你可以在任何情况下(上限,下限或混合)编写代码,但字符串始终区分大小写。例如:史密斯史密斯是两个不同的值。或者在你的表格中,如果有国家/地区列,如果你使用美国搜索,则不会找到美国。与$运算符相同,GE$德国是假的。

个人注意事项:虽然你可能因为它的简单性而喜欢$,但你可能会发现它经常用于 Microsoft 源代码,恕我直言,它的价值非常小。考虑到我在我的运算符中写过的成千上万行,我想我会在自己的代码中发现它很少出现。几乎总是有一个更好的选择(特别是当左操作数不是单个字符和\或区分大小写很重要时)。