[Delphi] spojení textu v cyklu FOR

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod dyžon 25. 6. 2018 09:57

zdravím,
narazil jsem na nečekanej problém a nevím jak se na to googlu zeptat, tak nemůžu najít žádnou pomoc.
příklad:
mám text adresy: Myslivecká 2215/37 a já z toho potřebuji udělat: Myslivecká 37. čili bez čísla orientačního.
napsal jsem:
Kód: Vybrat vše
function ZkratUlici(ulice: String): String;
var i: Integer; zapsat: Boolean; sUlice: String;
begin
  Result:= '';
  sUlice:= '';
  if pos(ulice, '/') > -1 then begin
    zapsat:= True;
    for i:= 0 to Length(ulice) do begin
      if zapsat then sUlice:= sUlice + ulice[i];
      if ulice[i] = ' ' then zapsat:= False;
      if ulice[i] = '/' then zapsat:= True;
    end;
  end;
  Result:= sUlice;
end;

ale bohužel výsledek je '' ... zkoušel jsem i jiny cykly, ale stejný.
problém je ve spojení sUlice s ulice. nechápu, proč se v cyklech ty stringy nespojují ..
když dám vypsat samostatny ulice[i], tak se to písmeno normálně zobrazí.
prosím pomozte.

[i]-- 25. 6. 2018 11:04 --


tak hned jak jsem to poslal mě napadlo to udělat jinak, dokonce líp, protože ta minulá funkce by špatě vrátila třeba adresu: U Potoka 1234/56, nebo: mojmírovo nám. 5566/12,
nová funkce vypadá takhle:
Kód: Vybrat vše
function ZkratUlici(ulice: String): String;
var i, a1, a2: Integer;
begin
  Result:= '';
  if pos(ulice, '/') > -1 then begin

    for i:= Length(ulice) downTo 0 do begin
      if ulice[i] = '/' then a2:= i;
      if ulice[i] = ' ' then begin a1:= i; break; end;
    end;
  end;
  Delete(ulice, a1 + 1, a2 -a1);
  Result:= ulice;
end;

pokud by se někomu chtělo mi vysvětlit proč nefunguje to spojování textu v cyklu, tak budu rád,
ale jinak je téma vyřešeno ...
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 25. 6. 2018 10:09

Podívej se na regularni vyrazy. Budeš to mít pružňejší (jednodušeji modifikovatelné). Unita TRegExpr:
http://regexpstudio.com/en/index.html
Tady máš pak český popis:
https://delphi.cz/post/Regularni-vyrazy-TRegExpr.aspx

PomoBudeš schopný najít cislo/cislo a pokud tam je, tak z nej vzit cast za lomitkem.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod dyžon 26. 6. 2018 08:43

děkuji, určitě na to mrknu podrobněji,
po letmém zhlédnutí z toho moc moudrej nejsem :o).
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 26. 6. 2018 09:12

zjednodusene hledas:
cislo/cislo s tim, ze si vyraz rozdelis do skupin. v prvni bude cislo lomitko a ve druhe pouze cislo: (\d+/)(\d+)
obycejnym nahrazenim v retezci pak nahradis nalezeny vyraz pouze za druhou skupinu: $2

564564/12 => 12

Pokud by přibyly varianty, např. že mezi číslem a lomítkem mohou být mezery nebo nebude lomítko, ale jiný znak, pak jen uděláš varianty v hledaném výrazu
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod dyžon 27. 6. 2018 07:16

hmmm,...
to zní dobře, určitě na to mrknu ... díky.
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků