![]() |
Variablen Interpolation in Delphi
Gibt es neben Format und FormatDateTime in Delphi noch andere Möglichkeiten, Platzhalter in Strings (ggf mit Formatierung) durch den Wert von Variablen zu ersetzen?
Zwar bietet Format mithilfe von Indizes die Möglichkeit, gezielt einen Wert aus dem übergebenen Array anzusprechen, ich suche hingegen nach einer Möglichkeit, die Variablen namentlich zu referenzieren, ähnlich, wie es in diversen Skriptsprachen möglich ist:
Code:
Idealerweise sollten die Platzhalter ein Typangabe sowie einen Defaultwert (und ggf eine Formatierungsbeschreibung) aufnehmen können, vielleicht etwas in der Art
foo= 6;
bar= 9; myString= "What do you get if you multiply $foo by $bar?";
Delphi-Quellcode:
oder auch die vollständige Auswertung von Teilausdrücken
myString:= AFunc('My number %ANumber:.6d|23 says %AString:s', SomeParams);
Delphi-Quellcode:
Ich bin auf der Suche nach einer fertigen und praxiserprobten Lösung. Bittet postet deshalb keinen Vorschlag der Art "nutze Pos und Copy" oder "nutze reguläre Ausdrücke". Im Zweifelsfall werde ich letztere verwenden, um etwas ähnliches auf der Basis eines assozativen Arrays von Varianten umzusetzen...
myString:= AFunc('The anwswer ist $(6*9+ANumber:Integer|23)', SomeParams);
Ich bin gespannt ;) |
Re: Variablen Interpolation in Delphi
Ich muss mal so doof fragen, aber was ist an Format nicht gut? Die macht eigentlich recht genau das ;-)
...:cat:... |
Re: Variablen Interpolation in Delphi
Zitat:
|
Re: Variablen Interpolation in Delphi
Zitat:
Zitat:
Delphi-Quellcode:
Wie ich benötige ist aber etwas in der Art
myString:= Format('A String: %2:s', [6, 9, '42']);
Delphi-Quellcode:
myString:= AFunc('A String: %AString:s',
[Value('Num1', 6), Value('Num2', 9), Value('AString', 42)]); Aus dem Aufruf kann man schon entnehmen, dass ich mir ungefähr soetwas vorstelle:
Delphi-Quellcode:
Tatsächlich würde ich Value und AFunc wahrscheinlich als Klassenmethoden einer Klasse implementieren, die in der Lage ist, benannte Werte-Mengen (assoziatives Array) und neben einfachen Tupeln auch Arrays aus Werten zu speichernn, so dass eine erweiterte Format-Syntax der Art
type
TMyValueTupel = record Ident: string; Value: Variant; end; function AFunc(const AMessage: string; const AValues: array of TMyValueType): string;
Code:
oder gar
'An array entry: $AnArray[2]:s'
Code:
denkbar ist.
'An array entry: $AnArray[$Num1]:s'
Im Wesentlichen entspricht dies etwas der Collection TParams aus der Unit DB mit den zugehörigen Items TParam, allerdings ist mir das zu SQL-spezifisch, bietet nicht ausreichend Funktionalität (zB Default-Values) und ist zu kompliziert in der Handhabe... Trotzdem möchte ich die Mühe ungern investieren, falls es eine entsprechende Lösung bereits gibt ;) |
Re: Variablen Interpolation in Delphi
Wenn ich dich richtig verstanden habe, willst du Variablen in einem String anhand ihres Namen finden und ersetzen???
Also wie bei SQL-Variablen " SQL := 'SELECT X FROM Y WHERE Z = :VAR;'"... Ein Lösungsweg dafür wäre eine kontextfreie Grammatik wie BNF. Schau mal auf ![]() Mit dem TParserAll bastel ich rum, falls ich endlich mal Zeit dazu finde. Die Grammatik würde so aussehen (BNF-Property des TParserAll):
Delphi-Quellcode:
Damit findest du alle Variablen, die mit einem ":" beginnen incl. Start- & Endposition.
<letter> ::= a..z<letter>|a..z
<digit> ::= 0..9 <underline> ::= '_'<underline>|'_' <dollar> ::= '$'<dollar>|'$' <number> ::= <digit><number>|<digit> <spec> ::= <number><spec>|<underline><spec>|<dollar><spec>| <number>|<underline>|<dollar> <id_body> ::= <letter><spec><id_body>|<letter><id_body>| <letter><spec>|<letter> <identifier> ::= ':'<id_body><identifier> |':'<id_body> Ich hoffe ich konnte dir damit weiterhelfen. |
Re: Variablen Interpolation in Delphi
Hallo GeorgeWNewbie,
der Einsatz einer kontextfreien Grammatik scheint mir für das blose Auffinden der Textpassagen etwas übertrieben, der reguläre Ausdruck für die von mir oben beschriebene Syntax inkl Arrays mit Zahlen als Indizes lautet schlicht
Code:
und kann dank eines Wrappers mit Referenzzählung in einer einfachen Schleife der Form
\$(\w+)(\[(\d+)\])?
Delphi-Quellcode:
angewendet werden...
with RegExp('\$(\w+)(\[(\d+)\])?') do
if Execute(AnInput) do repeat DoSthWidth(AnInput, MatchPos[0], MatchLen[0]); until not ExecuteNext; Das Problem mit den benannten Identifiern ist damit aber nach wie vor nicht gelöst. Ich müsste einen entsprechenden Container selbst verwalten (zuvor jedoch eine geeignete Lösung zur Erzeugung dieser Information erarbeiten), die Bezeichnungen parsen... Trotzdem, Danke! Wenn Du Dich für Grammatiken und Parsern für Delphi interssierst, ist vielleicht der ![]() |
Re: Variablen Interpolation in Delphi
Gibt es hier seit D2005 eine Veränderung oder steht lediglich System.String.Format als zusätzliche Möglichkeit der Stringformatierung zur Verfügung?
|
Re: Variablen Interpolation in Delphi
Zitat:
|
Re: Variablen Interpolation in Delphi
Hallo Sprint,
Zitat:
Zieht man darüber hinaus den zeitlichen Aufwand in Betracht, lässt sich meine Präferenz einer ausgereiften vorhanden Lösung verstehen, nicht wahr ;) |
Re: Variablen Interpolation in Delphi
Zitat:
Liegt vielleicht daran, das ich ein praktisch denkender Mensch bin. |
Re: Variablen Interpolation in Delphi
Was willst du denn ganz konkret für ein Problem lösen, das du nicht auf geringfügig anderem Wege auch durch vorhandene Mittel wie Format lösen könntest?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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