![]() |
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:
Da sind jetzt aber nur die Standardsachen drin ohne "+1"
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; Der Text: Zitat:
|
Re: Zeichenfolge in Strings ersetzen
Zitat:
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:
Dies erlaubt aber noch keine Berechnungen. Dazu braucht man einen Interpreter/Parser für mathematische Ausdrücke.
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; Dazu gibt es jede Menge Komponenten auf Torry's: ![]() 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. |
Re: Zeichenfolge in Strings ersetzen
und den Mathematichen Parser gibts seit dieser Nacht unter
![]() Lob an dizzy für das geile Teil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 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