Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zeichenfolge in Strings ersetzen (https://www.delphipraxis.net/25370-zeichenfolge-strings-ersetzen.html)

Nalincah 5. Jul 2004 15:46


Zeichenfolge in Strings ersetzen
 
Erstmal: Ich will hier nicht wissen wie ich best. Zeichen in einem String gegen andere ersetzen kann, sondern wie ich logisch dabei vorgehe.

Ich will in einem String z.B. "#MM" mit "07" (Aktueller Monat) oder "#JJJJ" mit "2004" (Jahr). Das ist auch an sich kein Problem.

Ich will aber auch #[M+1] ersetzen. Da soll dann statt "07" "08" stehen (Akt. Monat + 1). Wie kann ich da am besten nach suchen?

Momentan sieht mein Quellcode so aus (Auszug):
Delphi-Quellcode:
function FormatText(OldText:string):string;
  var
    sText:string;
    Year,Month,Day: Word;
    KW,Quartal:Integer;
    FormatText:string;
  begin
    sText := OldText;
    // Ermittlung Tag, Monat und Jahr
    DecodeDate(Date,Year,Month,Day);
    // Tag
    ...
    // Jahr
    while Pos('#JJJJ',sText) <> 0 do
    begin
      sText := StringReplace(sText,'#JJJJ',IntToStr(Year),[rfReplaceAll, rfIgnoreCase])
    end;
    while Pos('#JJ',sText) <> 0 do
    begin
      sText := StringReplace(sText,'#JJ',Copy(IntToStr(Year),3,2),[rfReplaceAll, rfIgnoreCase])
    end;
    // Kalenderwoche
    while Pos('#KW',sText) <> 0 do
    begin
      sText := StringReplace(sText,'#KW',IntToStr(WeekOfTheYear(Date)),[rfReplaceAll, rfIgnoreCase])
    end;
    // Quartal
    while Pos('#Q',sText) <> 0 do
    begin
      case Month of
        1..3:  sText := StringReplace(sText,'#Q','1',[rfReplaceAll, rfIgnoreCase]);
        4..6:  sText := StringReplace(sText,'#Q','2',[rfReplaceAll, rfIgnoreCase]);
        7..9:  sText := StringReplace(sText,'#Q','3',[rfReplaceAll, rfIgnoreCase]);
        10..12: sText := StringReplace(sText,'#Q','4',[rfReplaceAll, rfIgnoreCase]);
      end;
    end;
    Result := sText;
  end;
Da sind jetzt aber nur die Standardsachen drin ohne "+1"

Der Text:
Zitat:

#M
#MM
#ML
#JJ
#JJJJ
#D
#DD
#DL
#KW
#Q

#[M+1]

shmia 5. Jul 2004 16:49

Re: Zeichenfolge in Strings ersetzen
 
Zitat:

Zitat von General2004
Erstmal: Ich will hier nicht wissen wie ich best. Zeichen in einem String gegen andere ersetzen kann, sondern wie ich logisch dabei vorgehe.

Ich will in einem String z.B. "#MM" mit "07" (Aktueller Monat) oder "#JJJJ" mit "2004" (Jahr). Das ist auch an sich kein Problem.

Ich will aber auch #[M+1] ersetzen. Da soll dann statt "07" "08" stehen (Akt. Monat + 1). Wie kann ich da am besten nach suchen?

Der Eingabestring muss zunächst in Token zerlegt werden. Es gibt 2 Token:
Literale; also "normaler" Text und Variablen (bzw. Formeln)
Die Variablen müssen eindeutig erkannt werden. Am Einfachsten geht dies, indem man zwei
Begrenzungszeichen definiert (hier ist es das#-Zeichen).
Beispieltext: Heute ist der #dd#.#mm#.#yyyy#.
Es gibt eine Procedure, die den gesamten String liest und in Token zerlegt.
Die Literale werden an den Ausgabestring angehängt, während Variablen von einer eigenen
Funktion behandelt werden, deren Ergebnis ebenfalls an den Ausgabestring angehängt wird.
Die Funktion zur Behandlung der Variablen sieht ungefähr so aus:
Delphi-Quellcode:
function FConvert(const value:string):string;
begin
   if value = 'now' then
      result := DataTimeToStr(Now)
   else if value = 'KW' then
      Result := IntToStr(WeekOfTheYear(Date))
   else if .....
   else
   begin
      Result := '???';
      Assert(False, 'FConvert: Format not supported !');
   end;
end;
Dies erlaubt aber noch keine Berechnungen. Dazu braucht man einen Interpreter/Parser für mathematische Ausdrücke.
Dazu gibt es jede Menge Komponenten auf Torry's: Expressions
Ein "schlauer" Parser feuert ein Event, wenn er auf eine Variable oder Funktion trifft, die
er nicht kennt. Also würde man deine Formeln zuerst dem Parser vorlegen und dieser benützt dann
obige Funktion FConvert, wenn er deine Variablen in feste Werte umwandeln muss.
Man könnte auch komplett auf einen Parser setzen, der auch Stringverarbeitung beherrscht.
Dein Eingabestring würde von der Syntax aussehen wie Pascalcode.

SirThornberry 9. Jul 2004 06:18

Re: Zeichenfolge in Strings ersetzen
 
und den Mathematichen Parser gibts seit dieser Nacht unter
http://www.delphipraxis.net/internal...=201570#201570
Lob an dizzy für das geile Teil


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz