Меню

Как сравнить две строки delphi



Как сравнить две строки delphi

Работа со строками Delphi позволяет извлечь из строки необходимую информацию и представить её в нужном виде. Система предоставляет весь спектр необходимых функций для работы со строками Delphi и преобразования строк Delphi в необходимые форматы:

  • числовой формат, целый и дробный с плавающей точкой;
  • формат времени, даты, даты-времени;
  • преобразование символов к верхнему или нижнему регистру;
  • сравнение строк, поиск в строке и копирование подстроки;
    и многие другие.

Непосредственно сами строки Delphi поддерживают единственную операцию, так называемую операцию конкатенации, то есть присоединения. Несмотря на «научное» название, операция конкатенации выполняет очень простую процедуру. С помощью операции конкатенации одна строка присоединяется к другой:

Результирующая строка S будет суммой двух слагаемых строк. Длина строки, то есть количество символов в строке, возвращается встроенной функцией

function Length(S: String): Integer;

Delphi работает со строками типа String, в котором длина строки записывается в начале строки, перед первым символом. Поэтому индекс первого символа в строке не 0, а 1. То есть, если:

S:=’Строка типа String’;

то S[1] — символ ‘С’, S[2] — символ ‘т’ , последний символ в строке — S[Length(S)], равный ‘g’.

Однако часто приходится иметь дело со строками типа PChar, которые использует операционая система Windows. В строках типа PChar длина строки определяется специальным символом конца строки — #0. Поэтому для использования функций Windows тип String необходимо предварительно переводить в тип PChar. Преобразование типа String в тип PChar выполняет функция

function PChar(S: String): PChar;

Для полноценной работы со строками Delphi используются следующие стандартные процедуры и функции:

Функции преобразования в числовой формат и обратно

Выполняя вычисления, используем для ввода данных и отображения результатов следующие функции, работающие со строками Delphi:

функция IntToStr(N: Integer): String
Преобразует целое число N в строку.
функция StrToInt(S: String): Integer
Преобразует строку S в целое число.
функция FloatToStr(X: Extended): String
Преобразует число с плавающей точкой X в строку.
функция StrToFloat(S: String): Extended
Преобразует строку S в число с плавающей точкой.

Процедуры и функции преобразования дат и времени

Сначала собственно функции, предоставляющие информацию о текущих дате и времени:

функция Now: TDateTime
Возвращает текущую дату и время.
функция Date: TDateTime
Возвращает текущую дату.
функция Time: TDateTime
Возвращает текущее время.

Далее, функции, работающие с составляющими даты и времени (год, месяц, число, день недели, часы, минуты, секунды и даже миллисекунды):

функция DayOfWeek(Date: TDateTime): Integer
Возвращает текущий номер дня недели: 1 — воскресенье, 7 — суббота.
процедура DecodeDate(Date: TDateTime; var Year, Month, Day: Word)
Разбивает дату Date на год — Year, месяц — Month и день — Day.
процедура DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word)
Разбивает время Time на час — Hour, минуты — Min, секунды — Sec и миллисекунды — MSec.
функция EncodeDate(Year, Month, Day: Word): TDateTime
Объединяет год — Year, месяц — Month и день — Day в значение типа TDateTime.
функция EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime
Объединяет час — Hour, минуты — Min, секунды — Sec и миллисекунды — MSec в значение типа TDateTime.

Наконец, собственно, функции, переводящие дату и время из формата TDateTime в строчный формат:

функция DateTimeToStr(DateTime: TDateTime): String
Преобразует дату и время DateTime в строку.
функция DateToStr(Date: TDateTime): String
Преобразует дату Date в строку.
функция TimeToStr(Time: TDateTime): String
Преобразует время Time в строку.

Следующие функции работают с параметрами возвращаемой строки. Функции с приставкой Ansi работают в том числе и с кириллическими символами. Если символы в строках предполагаются исключительно латинские, то можно использовать аналогичные функции, но без приставки Ansi:

функция AnsiLowerCase(const S: String): String
Возвращает строку S, преобразованную к нижнему регистру.
функция AnsiUpperCase(const S: String): String
Возвращает строку S, преобразованную к верхнему регистру.
функция Length(const S: String): Integer
Возвращает количество символов в строке S.
функция Trim(const S: String): String
Удаляет из строки S начальные и завершающие пробелы и управляющие символы.
функция TrimLeft(const S: String): String
Удаляет из строки S начальные пробелы и управляющие символы.
функция TrimRight(const S: String): String
Удаляет из строки S завершающие пробелы и управляющие символы.
Читайте также:  Готовые сравнения по истории

Следующие функции сравнивают две строки между собой:

функция AnsiCompareStr(const S1, S2: String): Integer
Сравнивает две строки S1 и S2 с учётом регистра символов.
Возвращает значение 0 если S1>S2
функция AnsiCompareText(const S1, S2: String): Integer
Сравнивает две строки S1 и S2 без учёта регистра символов.
Возвращает значение 0 если S1>S2

Следующие функции осуществляют поиск в текущей строке подстроки, вставляют, удаляют или заменяют подстроку:

функция Pos(Substr: String; Str: String): Integer
Возвращает позицию (индекс) первого вхождения Substr в строке Str. Если Substr нет в Str, возвращает 0.
функция Insert(Source: String; var S: String; Index: Integer): Integer
Вставляет строку Source в строку S, начиная с номера символа, равного Index
процедура Delete(var S: String; Index, Count: Integer)
Удаляет из строки S подстроку, начинающуюся с номера символа, равного Index, и содержащую до Count символов.
функция StringReplace(const S, OldPattern, NewPattern: string; Flags: TReplaceFlags): String
Заменяет в строке S подстроку OldPattern на строку NewPattern с учётом флага TReplaceFlags. Для работы с этой функцией нужно создать переменную типа TReplaceFlags — это множество, и включить в него одно или оба значения из следующих:
rfReplaceAll — будут заменены все вхождения. Если это значение не будет включено во множество, то будет заменено только первое вхождение;
rfIgnoreCase — замена будет без учёта регистра символов. Если это значение не будет включено во множество, то замена будет чувствительна к регистру символов.

Наконец, функция копирования части строки:

функция Copy(S: String; Index, Count: Integer): String
Возвращает подстроку строки S, начиная с номера символа, равного Index и содержащую до Count символов.

Помимо прочего, эту функцию можно использовать для вывода нецелого числа с нужным количеством цифр после запятой. Для этого, сначала получаем строку из числа формата Real, затем находим функцией Pos позицию запятой в этой строке, прибавляем нужное количество и копируем в результат это количество символов. Вот готовая функция:

function RealToStr(X: Real; Count: Integer): String; //Count — количество цифр после запятой
var S: String;
N: Integer;
begin
S:=FloatToStr(X); //после запятой — длинная последовательность цифр
//DecimalSeparator — константа, содержащая истинный разделитель целой и дробной частей числа N:=Pos(DecimalSeparator, S); //позиция запятой в строке
//вычисляем длину строки с нужным количеством знаков после запятой:
if N=0 //если в строке нет запятой — это целое число, и
then N:=Length(S) //тогда просто выводим это число
else N:=N+Count; //иначе вычисляем длину строки
Result:=Copy(S, 1, N); //копируем часть строки в результат
end;

Или вот, к примеру, текст модуля, обеспечивающего ввод в компонент Edit только чисел.

Источник

Как сравнить две строки delphi

Интересует такой вопрос — как нужно правильно сравнивать между собой на равенство строки string ?

Я обычно сравниваю по старинке как S1 = S2 , иногда привожу к одному регистру через LowerCase .

Но заметил что в исходникак VCL строки часто сравниваются не с = , а спомощью функций CompareStr , AnsiCompareStr , AnsiCompareText и подобных.

Так чем же грозит сравнивание S1 = S2 и как правильно сравнивать строки ?


clickmaker © ( 2009-07-08 11:18 ) [1]

AnsiCompareStr сравнивает с учетом локали. CompareStr может не работать на национальных алфавитах


Palladin © ( 2009-07-08 11:19 ) [2]


> как правильно сравнивать строки ?

S1 = S2

все остальное имеет отношение к сравнению текста, ибо строка это тип переменной


Сергей М. © ( 2009-07-08 11:20 ) [3]

Если только на равенство и без учета тек.локали, то вариант S1=S2 вполне достаточен.

CompareStr — регистрочувствительное сравнение на меньше/равно/больше без учета тек.локали

CompareText — регистронечувствительное сравнение на меньше/равно/больше без учета тек.локали

AnsiCompareStr — регистрочувствительное сравнение на меньше/равно/больше с учетом тек.локали

AnsiCompareText — регистронечувствительное сравнение на меньше/равно/больше с учетом тек.локали.

Читайте также:  География карточка номер 3 сравнение

Что «правильней» — это решать тебе в каждом конкретном случае.


Anatoly Podgoretsky © ( 2009-07-08 11:45 ) [4]

«»ABC и «ABC » — это разные или одинаковые строки?

Т.е. если мне нужно сравнивать на посимвольное равенство — то метод S1 = S2 вполне рабочий ?

Просто прочитал статью http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1206
поразился множеству вариантов сравнения, и стали меня одолевать смутные сомнения, что я чегото неправильно делаю.

И еще смутило то, что для CompareStr используется функция, написанная на ассемблере, но уже для AnsiCompareStr — функция WinAPI.


b/@. © ( 2009-07-08 11:54 ) [6]


> Anatoly Podgoretsky © (08.07.09 11:45) [4]
> «»ABC и «ABC » — это разные или одинаковые строки?

Если набранные только латиницей или только кирилицей — то одинаковые. В чём фокус ?


Palladin © ( 2009-07-08 11:54 ) [7]


> Т.е. если мне нужно сравнивать на посимвольное равенство
> — то метод S1 = S2 вполне рабочий ?

а в чем сомнения? конечно


clickmaker © ( 2009-07-08 11:54 ) [8]

> И еще смутило то, что для CompareStr используется функция,
> написанная на ассемблере, но уже для AnsiCompareStr — функция
> WinAPI

а чего смущаться? CompareString — она как раз с учетом локали может сравнивать


Anatoly Podgoretsky © ( 2009-07-08 12:09 ) [9]

Фокуса нет, здесь нужен еще и TRIM кроме регистронезависимого сравнения.

Вот для примера кусок кода:

const
PARAM_Username = «user_name»;
PARAM_Password = «password»;

function GetParamValue(Params: TStrings; const ParamName: string; Erase: boolean = false): string;
var
i: integer;
begin
result := «»;
for i := Params.Count -1 downto 0 do
// а можно написать и вот так
// if Params.Names[i] = ParamName
if 0 = AnsiCompareText(Params.Names[i], ParamName)
then begin
result := Params.ValueFromIndex[i];
if Erase
then Params.Delete(i);
break;
end;
end;

Понимаю теперь — что зря я втулил AnsiCompareText — достаточно было и простого сравнения 🙂


clickmaker © ( 2009-07-08 12:48 ) [11]

> достаточно было и простого сравнения

достаточно было и Params.IndexOfName )


Игорь Шевченко © ( 2009-07-08 20:54 ) [12]

а нафига Erase при этом — я не понимаю, функция должна возвращать значения, а удалять — отдельная процедура(если так хочется удалить из параметров)


TIF © ( 2009-07-08 21:30 ) [13]

> Просто прочитал статью
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1206
> поразился множеству вариантов сравнения

Странно. «Compare» в тексте статьи встречается всего 1 раз 🙂

Это связано с тем, что функция AnsiPos использует функции StrPos и CompareString, предназначенные для работы со строками PChar .


b/@. © ( 2009-07-09 11:00 ) [14]


> clickmaker © (08.07.09 12:48) [11]
> достаточно было и Params.IndexOfName )


> Игорь Шевченко © (08.07.09 20:54) [12]
> Result := Params.Values[ParamName]
>
> а нафига — я не понимаю, функция должна возвращать значения, а удалять — отдельная процедура(если так хочется удалить из параметров)

В данном случае можно уже писать и так — раньше там было больше операторов, имменя для этого мне нужен был обратный цикл.

Erase при этом нафига — для того чтобы отделить обработанные параметры от необработанных. Например нужно просто узнать из параметров имя пользователя — для этого достаточно и Values[ParamName], но иногда имя пользователя нужно занести в одно поле — а остальные параметры в мемо.

Источник

Как сравнить две строки delphi

Интересует такой вопрос — как нужно правильно сравнивать между собой на равенство строки string ?

Я обычно сравниваю по старинке как S1 = S2 , иногда привожу к одному регистру через LowerCase .

Но заметил что в исходникак VCL строки часто сравниваются не с = , а спомощью функций CompareStr , AnsiCompareStr , AnsiCompareText и подобных.

Так чем же грозит сравнивание S1 = S2 и как правильно сравнивать строки ?


clickmaker © ( 2009-07-08 11:18 ) [1]

AnsiCompareStr сравнивает с учетом локали. CompareStr может не работать на национальных алфавитах

Читайте также:  Математика 3 класс что такое знаки сравнения


Palladin © ( 2009-07-08 11:19 ) [2]


> как правильно сравнивать строки ?

S1 = S2

все остальное имеет отношение к сравнению текста, ибо строка это тип переменной


Сергей М. © ( 2009-07-08 11:20 ) [3]

Если только на равенство и без учета тек.локали, то вариант S1=S2 вполне достаточен.

CompareStr — регистрочувствительное сравнение на меньше/равно/больше без учета тек.локали

CompareText — регистронечувствительное сравнение на меньше/равно/больше без учета тек.локали

AnsiCompareStr — регистрочувствительное сравнение на меньше/равно/больше с учетом тек.локали

AnsiCompareText — регистронечувствительное сравнение на меньше/равно/больше с учетом тек.локали.

Что «правильней» — это решать тебе в каждом конкретном случае.


Anatoly Podgoretsky © ( 2009-07-08 11:45 ) [4]

«»ABC и «ABC » — это разные или одинаковые строки?

Т.е. если мне нужно сравнивать на посимвольное равенство — то метод S1 = S2 вполне рабочий ?

Просто прочитал статью http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1206
поразился множеству вариантов сравнения, и стали меня одолевать смутные сомнения, что я чегото неправильно делаю.

И еще смутило то, что для CompareStr используется функция, написанная на ассемблере, но уже для AnsiCompareStr — функция WinAPI.


b/@. © ( 2009-07-08 11:54 ) [6]


> Anatoly Podgoretsky © (08.07.09 11:45) [4]
> «»ABC и «ABC » — это разные или одинаковые строки?

Если набранные только латиницей или только кирилицей — то одинаковые. В чём фокус ?


Palladin © ( 2009-07-08 11:54 ) [7]


> Т.е. если мне нужно сравнивать на посимвольное равенство
> — то метод S1 = S2 вполне рабочий ?

а в чем сомнения? конечно


clickmaker © ( 2009-07-08 11:54 ) [8]

> И еще смутило то, что для CompareStr используется функция,
> написанная на ассемблере, но уже для AnsiCompareStr — функция
> WinAPI

а чего смущаться? CompareString — она как раз с учетом локали может сравнивать


Anatoly Podgoretsky © ( 2009-07-08 12:09 ) [9]

Фокуса нет, здесь нужен еще и TRIM кроме регистронезависимого сравнения.

Вот для примера кусок кода:

const
PARAM_Username = «user_name»;
PARAM_Password = «password»;

function GetParamValue(Params: TStrings; const ParamName: string; Erase: boolean = false): string;
var
i: integer;
begin
result := «»;
for i := Params.Count -1 downto 0 do
// а можно написать и вот так
// if Params.Names[i] = ParamName
if 0 = AnsiCompareText(Params.Names[i], ParamName)
then begin
result := Params.ValueFromIndex[i];
if Erase
then Params.Delete(i);
break;
end;
end;

Понимаю теперь — что зря я втулил AnsiCompareText — достаточно было и простого сравнения 🙂


clickmaker © ( 2009-07-08 12:48 ) [11]

> достаточно было и простого сравнения

достаточно было и Params.IndexOfName )


Игорь Шевченко © ( 2009-07-08 20:54 ) [12]

а нафига Erase при этом — я не понимаю, функция должна возвращать значения, а удалять — отдельная процедура(если так хочется удалить из параметров)


TIF © ( 2009-07-08 21:30 ) [13]

> Просто прочитал статью
> http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1206
> поразился множеству вариантов сравнения

Странно. «Compare» в тексте статьи встречается всего 1 раз 🙂

Это связано с тем, что функция AnsiPos использует функции StrPos и CompareString, предназначенные для работы со строками PChar .


b/@. © ( 2009-07-09 11:00 ) [14]


> clickmaker © (08.07.09 12:48) [11]
> достаточно было и Params.IndexOfName )


> Игорь Шевченко © (08.07.09 20:54) [12]
> Result := Params.Values[ParamName]
>
> а нафига — я не понимаю, функция должна возвращать значения, а удалять — отдельная процедура(если так хочется удалить из параметров)

В данном случае можно уже писать и так — раньше там было больше операторов, имменя для этого мне нужен был обратный цикл.

Erase при этом нафига — для того чтобы отделить обработанные параметры от необработанных. Например нужно просто узнать из параметров имя пользователя — для этого достаточно и Values[ParamName], но иногда имя пользователя нужно занести в одно поле — а остальные параметры в мемо.

Источник