角色運算子

按優先順序只有 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 原始碼,恕我直言,它的價值非常小。考慮到我在我的運算子中寫過的成千上萬行,我想我會在自己的程式碼中發現它很少出現。幾乎總是有一個更好的選擇(特別是當左運算元不是單個字元和\或區分大小寫很重要時)。