![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
String [D6]
serko © (2006-03-03 00:01:00)Кажется простечкий вопрос но я его не могу просто решить получается очень громостко где я и сам запутываюсь! Может поможете, как сравнить две строки? Пример:
"Колбаса капченая" и "Колбаса капченая (20%)" - это одинаковые строки (в моем случае), а вот
"Колбаса" и "Колбаса капченая (5%)" - это разные строки.
Очень хороша функция POS, но она делает все эти строки одинаковыми.
Все происходит так:
Pos('Колбаса капченая','Колбаса') не должно равняться 1,
а вот Pos('Колбаса капченая','Колбаса капченая (20%)') должно быть 1.
Почему так проиходит незнаю, так надо наверное!
Посоветуйте тогда другие операторы сравнения или поска строки в строке.
unknown (2006-03-04 10:06:00) [1]
> serko © (03.03.06 23:48) [12]
> До такого и я додумывался, но если в названии "Колбасы"
> попадется "(" то уже не сработает такой код!
Немного дорабатываем код из [7] и все срабатывает :
uses StrUtils;
...
function GetPercents(Src:string;var Digits:integer):double;
var
x:Integer;
begin
x:=1;
while (x>0)and(x<Length(Src)) and (not (Src[x] in ['0'..'9'])) do
begin
x:=PosEx('(',Src,x);
if x>0 then
Inc(x);
end;
Src:=Copy(Src,X,AnsiPos('%',Src)-x);
Digits:=Length(Src);
if not TryStrToFloat(Src,Result) then
Result:=0;
end;
serko (2006-03-03 23:48:00) [2]
> unknown © (03.03.06 01:09) [7]
До такого и я додумывался, но если в названии "Колбасы" попадется "(" то уже не сработает такой код!
unknown (2006-03-03 11:32:00) [3]
> Desdechado © (03.03.06 11:30) [10]
> надо сформулировать признак "отличия" этих кобас
Во-во, а то пока догадаешься весь телепатор поламается :))
Desdechado (2006-03-03 11:30:00) [4]а с моей точки зрения вся колбаса одинаковая, и что?
это просто намек, что надо сформулировать признак "отличия" этих кобас
ASoft (2006-03-03 10:19:00) [5]Мож, потому что "колбаса к апченая", а не копченая" :) шутю..
А если у Вас используются базы данных, так не легче ли сформировать запрос по колбасе?
Джо (2006-03-03 01:23:00) [6]> [2] serko © (03.03.06 00:27)
> Почему Pos('Колбаса капченая','Колбаса')=1,
В том-то и дело — НЕвозвращает она "1", не возвращает! :0)
Проверь и убедись сам:
ShowMessageFmt ('%d',[Pos('Колбаса капченая','Колбаса')])
unknown (2006-03-03 01:09:00) [7]serko © (03.03.06 00:55) [5]
Убрать эту приставку вообще то легко, но как точно узнать что там 1, 2-х или
3-х значное число?
Так бы сразу и сказал.
function GetPercents(Src:string;var Digits:integer):double;
var
x:Integer;
begin
x:=AnsiPos('(',Src)+1;
Src:=Copy(Src,X,AnsiPos('%',Src)-X);
Digits:=Length(Src);
if not TryStrToFloat(Src,Result) then
Result:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
D:Integer;
G:Double;
begin
G:=GetPercents(Edit1.Text,D);
Caption:=FloatToStrF(G,fffixed,8,2)+' Digits : '+IntToStr(D) ;
end;
serko (2006-03-03 01:00:00) [8]А есть что нибудь типа Pos, но поиск последнего попадания подстроки в строке?
serko (2006-03-03 00:55:00) [9]Пример StringReplace сделайте.
Убрать эту приставку вообще то легко, но как точно узнать что там 1, 2-х или 3-х значное число?
unknown (2006-03-03 00:52:00) [10]Pos выдает № символа, с которого начинается подстрока в строке.
Для данного конкретного случая можно попробовать что-то типа этого:
function GetPercents(S1,S2:string):double;
begin
S1:=AnsiUpperCase(S1);
S2:=AnsiUpperCase(S2);
if AnsiPos(S1,S2)>0 then
Result:=(Length(S1)/Length(S2))*100
else
Result:=0.0;
end;
т.е. вычисляем процент совпадения строк.
А вообще поищи в сети реализацию алгоритма SoundEx
TStas (2006-03-03 00:30:00) [11]StringReplace, замените пустой строкой и все
serko (2006-03-03 00:27:00) [12]Чесно, я так и знал!
Почему Pos('Колбаса капченая','Колбаса')=1, если строки 'Колбаса капченая' и приблизительно нет в строке 'Колбаса'?
Кароче как мне откринуть приставку ' (20%)' или ' (5%)' или ' (100%)' если она там есть, в каждой строке, без особой мороки?
Джо (2006-03-03 00:19:00) [13]Ничего не понял, честно.