[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 10: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 11: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 09: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 10: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 08: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

Odeslat příspěvekod borekz 4. 8. 2019 12:33

Zkusil jsem tvůj kód na https://rextester.com/l/pascal_online_compiler a normálně funguje.
Akorát jsem musel změnit Result na ZkratUlici, aby to šlo přeložit. Možná ten Result je nějaká vychytávka pouze v Delphi.

https://rextester.com/WRAQA84522

Kód: Vybrat vše
program HelloWorld;

function ZkratUlici(ulice: String): String;
var i: Integer; zapsat: Boolean; sUlice: String;
begin
  ZkratUlici:= '';
  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;
  ZkratUlici:= sUlice;
end;

begin
    writeln(ZkratUlici('Myslivecká 2215/37'));
end.

Výstup: Myslivecká 37
borekz
Junior

Odeslat příspěvekod JanFiala 5. 8. 2019 10:53

borekz píše:Zkusil jsem tvůj kód na https://rextester.com/l/pascal_online_compiler a normálně funguje.
Akorát jsem musel změnit Result na ZkratUlici, aby to šlo přeložit. Možná ten Result je nějaká vychytávka pouze v Delphi.


Přiřazení výsledku do Result nebo do jména funkce je obdoba. Fungovalo to tak tuším už od dob TurboPascalu.
Přiřazení do Result slouží k zpřehlednění, víš, že jde o výsledek funkce. Když to přiřadíš do jména funkce, můžeš to přehlédnout jako přiřazení do proměnné apod.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar


Kdo je online

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