Распечатать страницу

Операции для символьных данных в Visual FoxPro

« Назад

С символьными данными применяются операции: "+", "–" и "$", а также операции отношения.

Операция "+" выполняет объединение (конкатенацию) двух строк, например:

result = str1 + str2

Операндами такого выражения могут быть константы, переменные и поля таблиц, имеющие тип Character или Memo, например:

str1 = "Объединение" + ", или " + "конкатенация"

resultStr = str1 + ' двух строк'

Операция "–", так же как и операция "+", применяется для объединения значений двух строк. Однако при использовании "–" завершающие пробелы первого операнда удаляются, например:

str1 = '123     '                     && В конце строки 5 пробелов

? str1 – '45'                         && Напечатает: 12345

? str1 + '45'                         && Напечатает: 123     45

Результатом выполнения операции "$" будет .T., если первый символьный операнд имеется во втором, или .F. – в противном случае, например:

? "123" $ "12345"              && Напечатает: .T.

? "134" $ "12345"              && Напечатает: .F.

Замечание. Операция "$" чувствительна к регистру и рашмор-неоптимизируема.

В выражении с символьными операндами наивысший приоритет имеет операция "+", наименьший – операция "$", например:

str1 = '123     '                     && В конце строки 5 пробелов

? '234' $ str1 – '45'             && Напечатает: .T.

? '234' $ str1 + '45'             && Напечатает: . F.

Вместо операции "$" можно применить встроенную функцию OCCURS( ), возвращающую число вхождений первого своего параметра во второй. Параметры функции должны иметь символьный тип. Например:

str1 = '123     '                     && В конце строки 5 пробелов

? Occurs('234', str1 – '45')  && Напечатает: 1

? Occurs('234', str1 + '45')  && Напечатает: 0

? Occurs('AB', 'abABabAB')  && Напечатает: 2

Полную замену операции "$" обеспечивает совместное употребление функции OCCURS( ) и операции отношение ">", например:

? Occurs("123", "12345") > 0 && Напечатает: .T.

С таким же успехом можно использовать встроенную функцию AT( ), возвращающую номер позиции вхождения своего первого символьного параметра во второй. При отсутствии вхождений функция вернет 0. например:

? At("234", "12345")          && Напечатает: 2

? At("237", "12345")          && Напечатает: 0

? At("234", "12345") > 0    && Напечатает: .T.

В операции отношения строки сравниваются посимвольно. Так,

? 'ac' > 'abcd'

напечатает .T., поскольку код символа "c" больше кода символа "b", а

? 'ab' > 'abcd'                      && Напечатает: .F.

Важно помнить, что на результаты операции отношения влияет установка команды SET EXACT, например:

set exact off

? 'abcd' = 'ab'                      && Напечатает: .T.

? 'abcd' > 'ab'                      && Напечатает: .F.

Результат объясняется тем, что при установке SET EXACT в OFF в сравнении участвуют только 2 символа – по числу символов правого операнда.

VFP увеличит размер короткой строки, добавляя к ней хвостовые пробелы, и станет сравнивать все символы операндов, если установить SET EXACT в ON, например:

set exact on

? 'abcd' = 'ab'                      && Напечатает: .F.

? 'abcd' > 'ab'                      && Напечатает: .T.

Исключение составляет операция "==", которая всегда работает, словно SET EXACT установлен в ON (пример см. в разд. 3.5.2 и 3.7.4)

Взамен операции отношения "==" можно употребить встроенную функцию LIKE( ), например

? Like('abcd', 'ab')               && Напечатает: .F.

? Like('abcd', 'abcd')            && Напечатает: . T.

Возможности функции LIKE( ), правда, несколько шире: в ее аргументы можно подставлять символы "*" и "?", используемые в общепринятом порядке, например:

? Like('ab*, 'abcd')              && Напечатает: . T.

? Like('ab??, 'abcd')            && Напечатает: . T.

? Like('ab?d, 'abcd')            && Напечатает: . T.

? Like('ab*d, 'abcd')            && Напечатает: . T.

? Like('ab?, 'abcd')              && Напечатает: . F.