AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi An welcher Position war/ist die Variable im Template

An welcher Position war/ist die Variable im Template

Ein Thema von RWarnecke · begonnen am 25. Jul 2016 · letzter Beitrag vom 26. Jul 2016
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: An welcher Position war/ist die Variable im Template

  Alt 25. Jul 2016, 21:21
Ich versuche dann mal etwas konstruktives (nur die Theorie):

Wir haben das Template, was irgendwo die Zeichenfolge '%counter%' enthält.
Oder anders betrachtet besteht das Template aus 3 Abschnitten:
  1. Eine Zeichenfolge
  2. %counter%
  3. Eine Zeichenfolge
Wenn man diese Zeichenfolgen hat, dann kann man (vereinfacht) aus dem eigentlichen String vorne und hinten die Längen der Zeichenfolgen wegnehmen und schon bleibt nur der String für den Counter übrig.

Code:
100%counter%3081%year%

Vorne 100 => 3 Zeichen
Hinten 3081%year% (year immer 4 Ziffern) => 30810000 => 8 Zeichen
Code:
100217830812016

3 Zeichen vorne entfernen => 217830812016
8 Zeichen hinten entfernen => 2178
heureka!
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (25. Jul 2016 um 21:26 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: An welcher Position war/ist die Variable im Template

  Alt 25. Jul 2016, 21:41
Also noch ein Versuch einer Lösung:

Du musst für jedes Template den entsprechenden höchsten Wert aus Deinen Daten ermitteln, alles aus diesem Wert entfernen, was nicht durch den Platzhalter %counter% in den Wert eingeflossen ist und schon hast Du den Wert für %counter%.

Da wir keine konkreteren Informationen über den Ursprung der Daten und den Aufbau der Templates haben als: "kann so P%counter%%year% oder so ähnlich aussehen", können wir auch keine konkretere Lösung entwickeln, als es könnte so oder so ähnlich gehen.

Und Vorschläge für so oder so ähnlich gibt es jetzt schon einige.

Sir Rufo beschrieb in seinem letzten Beitrag das, was ich mit meinem Vorschlag meinte.

Man nehme aus dem größten vorhandenen Wert alles heraus, was "fest" im Template enthalten ist, entferne das Jahr und schon hat man den Counter.

Da es unterschiedliche Templates gibt, muss für jedes Template eine eigene Counterextrahiermethode her. Die bisherigen Informationen lassen nicht erkennen, dass es eine allgemeingültige Lösung für beliebige Templates geben könnte.

Geändert von nahpets (25. Jul 2016 um 22:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.630 Beiträge
 
Delphi 12 Athens
 
#3

AW: An welcher Position war/ist die Variable im Template

  Alt 25. Jul 2016, 22:30
Eigentlich bin ich ja der Letzte, der sowas vorschlagen würde, aber nach dem Vortrag von Daniel bei der CodeRage DE:
Delphi-Quellcode:
uses
  System.RegularExpressions;

function ExtractCounter(const Template, Value: string): Integer;
var
  pattern: string;
begin
  pattern := Template.Replace('%counter%', '([\d]+)', [rfIgnoreCase]).Replace('%year%', '(?:[\d]{4})', [rfIgnoreCase]);
  result := TRegEx.Match(Value, pattern).Groups[1].Value.ToInteger;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: An welcher Position war/ist die Variable im Template

  Alt 25. Jul 2016, 22:39
Oder eben nach alter Väter Sitte:
Delphi-Quellcode:
program Project4;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils;

function GetCounterFromTemplatedString( const Str, Template: string ): Integer;
const
  CCounter = '%counter%';
  CYear = '%year%';
  CYearDefault = '0000';
var
  tmp : string;
  lFirst, lTail, lLength: Integer;
begin
  tmp := Template.Replace( CYear, CYearDefault );
  lFirst := tmp.IndexOf( CCounter );
  if lFirst = -1
  then
    raise Exception.Create( 'Fehlermeldung' );

  lTail := tmp.Length - lFirst - CCounter.Length;
  lLength := Str.Length - lFirst - lTail;

  tmp := Str.Substring( lFirst, lLength );
  Result := Integer.Parse( tmp );
end;

procedure Check( const Str, Template: string; expected: Integer );
begin
  if GetCounterFromTemplatedString(str,template) <> expected then
    raise Exception.Create('Fehlermeldung');
end;

procedure Test;
begin
  Check( '1001030812016', '100%counter%3081%year%', 10 );
  Check( '10012530812016', '100%counter%3081%year%', 125 );
  Check( '100217830812016', '100%counter%3081%year%', 2178 );
  Check( '10047930812016', '100%counter%3081%year%', 479 );

  Check( 'P12016', 'P%counter%%year%', 1 );
  Check( 'P1002016', 'P%counter%%year%', 100 );
end;

begin
  try
    Test;
  except
    on E: Exception do
      Writeln( E.ClassName, ': ', E.Message );
  end;
  ReadLn;

end.
PS: leider allgemeingültig
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (25. Jul 2016 um 22:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz