Code:

{ **** UBPFD *********** by kladovka.net u ****

>> Расстояние (разность) между двумя строками. Функция Левенштейна

 

Зависимости: System

Автор: Андрей aka wicked, Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра., ICQ:92356239, Тернополь

Copyright: описание алгоритма взято с https://www.merriampark com / ld.htm, реализация моя

 

********************************************** }

 

const cuthalf = 100; // константа, ограничивающая макс. длину

// обрабатываемых строк

 

var buf: array [0..((cuthalf * 2) - 1)] of integer; // рабочий буффер, заменяет

// матрицу, представленную

// в описании

 

function min3(a, b, c: integer): integer; // вспомогательная функция

begin

Result := a;

if b < Result then Result := b;

if c < Result then Result := c;

end;

 

// реализация функции в принципе соответствует описанию с одной оговоркой:

// матрица из описания заменена статическим буффером, длина которого

// равна удвоенной максимальной длине строк

// это сделано для 1) экономии памяти и во избежание её перераспределений

// 2) повышения быстродействия (у меня функция работает

// в обработчике onfilterRecord)

// таким образом, в реализации половинами буффера представлены только

// две последние строки матрицы, которые меняются местами каждую

// итерацию внешнего цикла (по i)... для определения того, какая из половин

// буффера является "нижней строкой", служит переменная flip

// т. е. при flip = false первая половина буффера является предпоследней

// строкой, а вторая - последней; при flip = true наоборот,

// первая половина - последняя строка, вторая половина - предпоследняя

 

function LeveDist(s, t: string): integer;

var i, j, m, n: integer;

cost: integer;

flip: boolean;

begin

s := copy(s, 1, cuthalf - 1);

t := copy(t, 1, cuthalf - 1);

m := length(s);

n := length(t);

if m = 0then Result := n

elseif n = 0then Result := m

elsebegin

flip := false;

for i := 0to n do buf[i] := i;

for i := 1to m dobegin

if flip then buf[0] := i

else buf[cuthalf] := i;

for j := 1to n dobegin

if s[i] = t[j] then cost := 0

else cost := 1;

if flip then

buf[j] := min3((buf[cuthalf + j] + 1),

(buf[j - 1] + 1),

(buf[cuthalf + j - 1] + cost))

else

buf[cuthalf + j] := min3((buf[j] + 1),

(buf[cuthalf + j - 1] + 1),

(buf[j - 1] + cost));

end;

flip := not flip;

end;

if flip then Result := buf[cuthalf + n]

else Result := buf[n];

end;

end;

 

 

 

 

Пример использования:

Code:

// на форме имеются поля Edit1 и Edit2, метка Label1

.....

Label1.Caption := IntToStr(LeveDist(Edit1.Text, Edit2.Text));

.....

Code:

const

vlist = 'первый, второй, третий';

 

var

Values: TStringList;

 

procedure SetValues(VL : TStringList; S: String);

var

I : Integer;

begin

VL.CommaText := S;

for I := 0to CL.Count-1do

VL.Objects[I] := Pointer(I);

VL.Sorted := True;

end;

 

function GetValueIndex(VL : TStringList; Match: String): Integer;

begin

Result := VL.IndexOf(Match);

if Result >= 0then

Result := Integer(VL.Objects[Result]);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

case GetValueIndex(Values, Edit1.Text) of

-1: {не найден} ;

0: Caption := '0';

1: Caption := '1';

2: Caption := '2';

end;

end;

 

initialization

VL := TStringList.Create;

SetValues(VL, vlist);

 

finalization

VL.Free;

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

 

Следующие две процедуры показывают, как это можно сделать:

 

Code:

procedure TMainForm.LoadFileIntoList(TextFileName: string;

AWebPage: TStringList; WithFilter: Boolean);

var

CurrentFile: TStringList;

begin

CurrentFile := TStringList.Create;

CurrentFile.LoadFromFile(TextFileName);

if WithFilter then

FilterHTML(CurrentFile,AWebPage)

else

with AWebPage do

AddStrings(CurrentFile);

CurrentFile.Free;

end;

 

procedure TMainForm.FilterHTML(FilterInput, AWebPage: TStringList);

var

i, j: LongInt;

S: string;

begin

FilterMemo.Lines.Clear;

FilterMemo.Lines := FilterInput;

 

with AWebPage do

begin

FilterMemo.SelectAll;

j := FilterMemo.SelLength;

 

if j > 0then

begin

i := 0;

repeat

// ищем cr

if FilterMemo.Lines.GetText[i] = Char(VK_RETURN) then

S := S + #10#13;

else

if FilterMemo.Lines.GetText[i] = '<'then

repeat

inc(i);

until

FilterMemo.Lines.GetText[i] = '>'

else

// ищем tab

if FilterMemo.Lines.GetText[i] = Char(VK_TAB) then

S := S + ' '

else

S := S + FilterMemo.Lines.GetText[i]; // добавляем текст

inc(i);

until

i = j + 1;

Add(S); // добавляем строку в WebPage

end

else

Add('No data entered into field.'); // no data in text file

end;

end;

 

Применение функции:

 

Всё, что нужно сделать - это вызвать :

LoadFileIntoList("filename.txt",Webpage, True);

 

Где:

 

filename

это имя файла, который вы хотите обработать.

WebPage

это TStringList

последний параметр в функции

указывает, применять или нет HTML-фильтр.

PS: В этом примере объект TMemo (который вызывается из "FilterMemo") лежит на форме и поэтому не видим.

 

Пример:

Code:

WebPage := TStringList.Create;

try

Screen.Cursor := crHourGlass;

AddHeader(WebPage);

with WebPage do

begin

Add('Personal Details');

LoadFileIntoList("filename.txt", Webpage, True);

end;

AddFooter(WebPage);

finally

WebPage.SaveToFile(HTMLFileName);

WebPage.Free;

Screen.Cursor := crDefault;

end;

 

 

Code:

{ **** UBPFD *********** by kladovka.net ****

>> Сумма и количество прописью, работа с падежами

 

Несколько функций для работы с строками:

function SumToString(Value : String) : string;//Сумма прописью

function KolToStrin(Value : String) : string;//Количество прописью

function padeg(s:string):string;//Склоняет фамилию имя и отчество (кому)

function padegot(s:string):string;//Склоняет фамилию имя и отчество (от кого)

function fio(s:string):string;//фамилия имя и отчество сокращенно

function longdate(s:string):string;//Длинная дата

procedure getfullfio(s:string;var fnam,lnam,onam:string);//Получить из строки фамилию имя и отчество сокращенно

 

Зависимости: uses SysUtils, StrUtils,Classes;

Автор: Eda, eda @ arhadm.net.ru, Архангельск

Copyright: Eda

 

********************************************** }

 

unit sumstr;

 

interface

uses

SysUtils, StrUtils,Classes;

var rub:byte;

function SumToString(Value : String) : string;//Сумма прописью

function KolToStrin(Value : String) : string;//Количество прописью

function padeg(s:string):string;//Склоняет фамилию имя и отчество (кому)

function padegot(s:string):string;//Склоняет фамилию имя и отчество (от кого)

function fio(s:string):string;//фамилия имя и отчество сокращенно

function longdate(s:string):string;//Длинная дата

procedure getfullfio(s:string;var fnam,lnam,onam:string);//Получить из строки фамилию имя и отчество сокращенно

 

implementation

const a:array[0..8,0..9] ofstring=(

('','один ','два ','три ','четыре ','пять ','шесть ','семь ','восемь ','девять '),

('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),

('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '),

('тысяч ','одна тысяча ','две тысячи ','три тысячи ','четыре тысячи ','пять тысяч ','шесть тысяч ','семь тысяч ','восемь тысяч ','девять тысяч '),

('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),

('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '),

('миллионов ','один миллион ','два миллиона ','три миллиона ','четыре миллиона ','пять миллионов ','шесть миллионов ','семь миллионов ','восемь миллионов ','девять миллионов '),

('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),

('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '));

c:array[0..8,0..9] ofstring=(

('','одна ','две ','три ','четыре ','пять ','шесть ','семь ','восемь ','девять '),

('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),

('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '),

('тысячь ','одна тысяча ','две тысячи ','три тысячи ','четыре тысячи ','пять тысяч ','шесть тысяч ','семь тысяч ','восемь тысяч ','девять тысяч '),

('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),

('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '),

('миллионов ','один миллион ','два миллиона ','три миллиона ','четыре миллиона ','пять миллионов ','шесть миллионов ','семь миллионов ','восемь миллионов ','девять миллионов '),

('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),

('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '));

b:array[0..9] ofstring=

('десять ','одинадцать ','двенадцать ','тринадцать ','четырнадцать ','пятнадцать ','шестнадцать ','семнадцать ','восемнадцать ','девятнадцать ');

var pol:boolean;

 

function longdate(s:string):string;//Длинная дата

var

Pr: TDateTime;

Y,M,D: Word;

begin

Pr:= strtodate(s);

DecodeDate(Pr,Y,M,D);

case m of

1:s:='Января';

2:s:='Февраля';

3:s:='Марта';

4:s:='Апреля';

5:s:='Мая';

6:s:='Июня';

7:s:='Июля';

8:s:='Августа';

9:s:='Сентября';

10:s:='Октября';

11:s:='Ноября';

12:s:='Декабря';

end;

result:=inttostr(d)+' '+s+' '+inttostr(y)

end;

 

function SumToStrin(Value : String) : string;

var s,t:string;

p,pp,i,k:integer;

begin

s:=value;

if s='0'then t:='Ноль 'elsebegin

p:=length(s);

pp:=p;

if p>1then

if (s[p-1]='1') and (s[p]>='0') thenbegin

t:=b[strtoint(s[p])];pp:=pp-2;end;

i:=pp;

while i>0dobegin

if (i=p-3) and (p>4) then

if s[p-4]='1'thenbegin

t:=b[strtoint(s[p-3])]+'тысяч '+t;i:=i-2;end;

if (i=p-6) and (p>7) then

if s[p-7]='1'thenbegin

t:=b[strtoint(s[p-6])]+'миллионов '+t;

i:=i-2;end;

if i>0thenbegin k:=strtoint(s[i]);

t:=a[p-i,k]+t;

i:=i-1;end;

end;end;

result:=t;

end;

 

function kolToStrin(Value : String) : string;

var s,t:string;

p,pp,i,k:integer;

begin

s:=value;

if s='0'then t:='Ноль 'elsebegin

p:=length(s);

pp:=p;

if p>1then

if (s[p-1]='1') and (s[p]>'0') thenbegin

t:=b[strtoint(s[p])];pp:=pp-2;end;

i:=pp;

while i>0dobegin

if (i=p-3) and (p>4) then

if s[p-4]='1'thenbegin

t:=b[strtoint(s[p-3])]+'тысяча '+t;i:=i-2;end;

if (i=p-6) and (p>7) then

if s[p-7]='1'thenbegin

t:=b[strtoint(s[p-6])]+'миллионов '+t;

i:=i-2;end;

if i>0thenbegin k:=strtoint(s[i]);

t:=c[p-i,k]+t;

i:=i-1;end;

end;end;

result:=t;

end;

 

procedure get2str(value:string;var hi,lo:string);

var p:integer;

begin

p:=pos(',',value);

lo:='';hi:='';

if p=0then p:=pos('.',value);

if p<>0then delete(value,p,1);

if p=0thenbegin hi:=value;lo:='00';exit;end;

if p>length(value) thenbegin hi:=value;lo:='00';exit;end;

if p=1thenbegin hi:='0';lo:=value;exit;end;

begin

hi:=copy(value,1,p-1);

lo:=copy(value,p,length(value));

if length(lo)<2then lo:=lo+'0';

end;

end;

 

function sumtostring(value:string):string;

var hi,lo,valut,loval:string;

pr,er:integer;

begin

get2str(value,hi,lo);

if (hi='') or (lo='') thenbegin result:='';exit;end;

val(hi,pr,er);if er<>0thenbegin result:='';exit;end;

if rub=0thenbegin

if hi[length(hi)]='1'then valut:='рубль ';

if (hi[length(hi)]>='2') and (hi[length(hi)]<='4') then valut:='рубля ';

if (hi[length(hi)]='0') or (hi[length(hi)]>='5') or

((strtoint(copy(hi,length(hi)-1,2))>10) and (strtoint(copy(hi,length(hi)-1,2))<15)) then valut:='рублей ';

if (lo[length(lo)]='0') or (lo[length(lo)]>='5') then loval:=' копеек';

if lo[length(lo)]='1'then loval:=' копейка';

if (lo[length(lo)]>='2') and (lo[length(lo)]<='4') then loval:=' копейки';

end

elsebegin

if (hi[length(hi)]='0') or (hi[length(hi)]>='5') then valut:='долларов ';

if hi[length(hi)]='1'then valut:='доллар ';

if (hi[length(hi)]>='2') and (hi[length(hi)]<='4') then valut:='доллара ';

if (lo[length(lo)]='0') or (lo[length(lo)]>='5') then loval:=' центов';

if lo[length(lo)]='1'then loval:=' цент';

if (lo[length(lo)]>='2') and (lo[length(lo)]<='4') then loval:=' цента';

end;

hi:=sumtostrin(inttostr(pr))+valut;

if lo<>'00'thenbegin

val(lo,pr,er);if er<>0thenbegin result:='';exit;end;

lo:=inttostr(pr);

end;

if length(lo)<2then lo:='0'+lo;

lo:=lo+loval;

hi[1]:=AnsiUpperCase(hi[1])[1];

result:=hi+lo;

end;

 

function pfam(s:string):string;

begin

if (s[length(s)]='к') or(s[length(s)]='ч') and (pol=true) then s:=s+'у';

if s[length(s)]='в'then s:=s+'у';

if s[length(s)]='а'thenbegin delete(s,length(s),1);

result:=s+'ой';exit;end;

if s[length(s)]='н'then s:=s+'у';

if s[length(s)]='й'thenbegin delete(s,length(s)-1,2);

result:=s+'ому';end;

if s[length(s)]='я'thenbegin delete(s,length(s)-1,2);

result:=s+'ой';exit;end;

result:=s;

end;

 

function pnam(s:string):string;

begin

pol:=true;

if s[length(s)]='й'thenbegin delete(s,length(s),1);

s:=s+'ю';end;

if s[length(s)]='л'then s:=s+'у';

if s[length(s)]='р'then s:=s+'у';

if s[length(s)]='м'then s:=s+'у';

if s[length(s)]='н'then s:=s+'у';

if s[length(s)]='я'thenbegin pol:=false;delete(s,length(s),1);

s:=s+'е';end;

if s[length(s)]='а'thenbegin pol:=false;delete(s,length(s),1);

s:=s+'е';end;

result:=s;

end;

 

function potch(s:string):string;

begin

if s[length(s)]='а'thenbegin delete(s,length(s),1);

s:=s+'е';end;

if s[length(s)]='ч'then s:=s+'у';

result:=s;

end;

 

function ofam(s:string):string;

begin

if (s[length(s)]='к') or(s[length(s)]='ч') and (pol=true) then s:=s+'а';

if s[length(s)]='а'thenbegin delete(s,length(s),1);

result:=s+'ой';exit;end;

if s[length(s)]='в'then s:=s+'а';

if s[length(s)]='н'then s:=s+'а';

if s[length(s)]='й'thenbegin delete(s,length(s)-1,2);

result:=s+'ова';end;

if s[length(s)]='я'thenbegin delete(s,length(s)-1,2);

result:=s+'ой';exit;end;

result:=s;

end;

 

function onam(s:string):string;

begin

pol:=true;

if s[length(s)]='а'thenif s[length(s)-1]='г'then

begin pol:=false;delete(s,length(s),1);

s:=s+'и';endelse

begin pol:=false;delete(s,length(s),1);

s:=s+'ы';end;

if s[length(s)]='л'then s:=s+'а';

if s[length(s)]='р'then s:=s+'а';

if s[length(s)]='м'then s:=s+'а';

if s[length(s)]='н'then s:=s+'а';

if s[length(s)]='я'thenbegin pol:=false;delete(s,length(s),1);

s:=s+'и';end;

if s[length(s)]='й'thenbegin delete(s,length(s),1);

s:=s+'я';end;

result:=s;

end;

 

function ootch(s:string):string;

begin

if s[length(s)]='а'thenbegin delete(s,length(s),1);

s:=s+'ы';end;

if s[length(s)]='ч'then s:=s+'а';

result:=s;

end;

 

function padeg(s:string):string;

var q:tstringlist;

p:integer;

begin

if s<>''thenbegin

q:=tstringlist.Create;

p:=pos(' ',s);

if p=0then p:=pos('.',s);

if p=0then q.Add(s) elsebegin

q.Add(copy(s,1,p-1));

delete(s,1,p);

p:=pos(' ',s);

if p=0then p:=pos('.',s);

if p=0then q.Add(s) elsebegin

q.Add(copy(s,1,p-1));

delete(s,1,p);

p:=pos(' ',s);

if p=0then p:=pos('.',s);

if p=0then q.Add(s) elsebegin

q.Add(copy(s,1,p-1));

delete(s,1,p);end;

end;end;

if q.Count>1then result:=result+' '+pnam(q[1]);

if q.Count>0then result:=pfam(q[0])+result;

if q.Count>2then result:=result+' '+potch(q[2]);

q.Free;

end;

end;

 

function fio(s:string):string;

var q:tstringlist;

p:integer;

begin

if s<>''thenbegin

q:=tstringlist.Create;

p:=pos(' ',s);

if p=0then p:=pos('.',s);

if p=0then q.Add(s) elsebegin

q.Add(copy(s,1,p-1));

delete(s,1,p);

p:=pos(' ',s);

if p=0then p:=pos('.',s);

if p=0then q.Add(s) elsebegin

q.Add(copy(s,1,1));

delete(s,1,p);

p:=pos(' ',s);

if p=0then p:=pos('.',s);

if p=0then q.Add(copy(s,1,1)) elsebegin

q.Add(copy(s,1,1));

end;

end;end;

if q.Count>1then result:=q[0]+' '+q[1]+'.';

if q.Count>2then result:=result+q[2]+'.';

q.Free;

end;

end;

 

function padegot(s:string):string;

var q:tstringlist;

p:integer;

begin

if s<>''thenbegin

q:=tstringlist.Create;

p:=pos(' ',s);

if p=0then p:=pos('.',s);

if p=0then q.Add(s) elsebegin

q.Add(copy(s,1,p-1));

delete(s,1,p);

p:=pos(' ',s);

if p=0then p:=pos('.',s);

if p=0then q.Add(s) elsebegin

q.Add(copy(s,1,p-1));

delete(s,1,p);

p:=pos(' ',s);

if p=0then p:=pos('.',s);

if p=0then q.Add(s) elsebegin

q.Add(copy(s,1,p-1));

delete(s,1,p);end;

end;end;

if q.Count>1then result:=result+' '+onam(q[1]);

if q.Count>0then result:=ofam(q[0])+result;

if q.Count>2then result:=result+' '+ootch(q[2]);

q.Free;

end;

end;

 

procedure getfullfio(s:string;var fnam,lnam,onam:string);//Получить из строки фамилию имя и отчество сокращенно

begin

fnam:='';lnam:='';onam:='';

fnam:=copy(s,1,pos(' ',s));

delete(s,1,pos(' ',s));

lnam:=copy(s,1,pos(' ',s));

delete(s,1,pos(' ',s));

onam:=s;

end;

 

begin

rub:=0;

end.

 

 

 

 

Пример использования:

Code:

s:=SumToString('123.00');

Code:

{ **** UBPFD *********** by delphibase.endimus  ****

>> Функция проверки корректности ввода

 

Результат истина в случае если во входной строке нет недопустимых

символов

Rej - флаг режима

если Rej:=true, то Conf - строка недопустимых символов

если Rej:=false, то Conf - строка допустимых символов

Input - входная строка

 

Зависимости: Стандартные модули

Автор: Ru, DiVo_R u @ rambler.ru, Одесса

Copyright: DiVo 2002, creator Ru

 

***************************************************** }

 

function ConformStr(Input, Conf: string; Rej: boolean): boolean;

var

i: integer;

begin

result := true;

if Rej then

begin

for i := 1to length(Conf) do

begin

if pos(Conf[i], Input) <> 0then

begin

result := false;

break;

end

end;

end

else

begin

for i := 1to length(Input) do

begin

if pos(Input[i], Conf) = 0then

begin

result := false;

break;

end;

end;

end;

end;

Пример использования:

 

s := 'Приве6т!';

ifnot ConformStr(s, '0123456789') then

s := Strtst(s, '0123456789');

//после этого s='Привет!'