- Offizieller Beitrag
Ich verwende ja sehr gerne StringFormat. Ist deutlich übersichtlicher als eine Stringverkettung mit den vielen Wechseln zwischen & und Variablen/Text. Auch der Einsatz von verschiedenen Stringbegrenzern ist deutlicher zu handeln. Was mich etwas störte ist, dass bei Angabe vieler Variablen nicht auf Anhieb sichtbar ist, welche Variable zu welchem Format-Platzhalter gehört.
Deshalb habe ich mir eine andere Version der Funktion erstellt (_StringFormat), in der die zugehörige Variable direkt im Anschluss an den Format-Platzhalter innerhalb einer geschweiften Klammer angegeben wird.
Wundert euch nicht über den Variablennamen, den ich in der Funktion für die Zählvariable der Schleife verwendet habe: Hier musste ich sicherstellen, dass dies keine Variable sein kann, die vom Funktions-Anwender genutzt werden könnte.
; Bsp:
; gewünschter String:
; [DATUM UHRZEIT] Der Prozeß "NAME-Prozeß" wurde von User 'NAME-User@Domain' gestartet.
; Variablen:
; DATUM & UHRZEIT -- Makros
Global $sNameProcess = 'EinProzeß'
; NAME-User@Domain -- Makros
; Lösung mit String-Verkettung:
Global $sResult = '[' & @MDAY & '.' & @MON & '.' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC & '] Der Prozeß "' & $sNameProcess & '" wurde von User ''' & @UserName & '@' & @LogonDomain & ''' gestartet.'
ConsoleWrite($sResult & @CRLF)
; Lösung mit StringFormat
$sResult = StringFormat('[%02i.%02i.%i %02i:%02i:%02i] Der Prozeß "%s" wurde von User ''%s@%s'' gestartet.', @MDAY, @MON, @YEAR, @HOUR, @MIN, @SEC, $sNameProcess, @UserName, @LogonDomain)
ConsoleWrite($sResult & @CRLF)
; Lösung mit _StringFormat
$sResult = _StringFormat('[%02i{@MDAY}.%02i{@MON}.%i{@YEAR} %02i{@HOUR}:%02i{@MIN}:%02i{@SEC}] Der Prozeß "%s{$sNameProcess}" wurde von User ''%s{@UserName}@%s{@LogonDomain}'' gestartet.')
ConsoleWrite($sResult & @CRLF)
; Bsp. für Maskierung von geschweiften Klammern und Backslash im Textanteil
$sResult = _StringFormat('[%02i{@MDAY}.%02i{@MON}.%i{@YEAR} %02i{@HOUR}:%02i{@MIN}:%02i{@SEC}] Hier ist ein String mit \{intern geschweiften Klammern und einfachem (\\) oder doppeltem (\\\\) darin\}.')
ConsoleWrite($sResult & @CRLF)
; #FUNCTION# ====================================================================================================================
; Name ..........: _StringFormat
; Description ...: Works like StringFormat, but with another syntax
; Syntax ........: _StringFormat($_sFormat)
; Parameters ....: $_sFormat - In contrast to StringFormat, the variables are given inside curly braces directly
; behind the associated format placeholders.
; example: "[%010s]{$stringVar} %02i{$integerVar}"
; Return values .: The formatted string
; Note ..........: If it is necessary to use curly braces within the normal body, they must be masked with a backslash.
; Author ........: BugFix
; ===============================================================================================================================
Func _StringFormat($_sFormat)
$_sFormat = StringReplace(StringReplace(StringReplace($_sFormat, '"', '""'), '\{', Chr(1)), '\}', Chr(2))
Local $aParam = StringRegExp($_sFormat, '\{([^\}]+)}', 3)
Local $tmp, $sParam = '', $sFormat = StringRegExpReplace($_sFormat, '(\{[^\}]+})', '')
$sFormat = StringReplace(StringReplace($sFormat, Chr(1), '{'), Chr(2), '}')
For $__iCount_Execute_Param_Loop__ = 0 To UBound($aParam) -1
$tmp = Execute($aParam[$__iCount_Execute_Param_Loop__])
$sParam &= StringFormat('"%s"', $tmp) & ', '
Next
$sParam = StringTrimRight($sParam, 2)
Local $sCmd = StringFormat('StringFormat("%s", %s)', $sFormat, $sParam)
Local $sResult = Execute($sCmd)
Return $sResult
EndFunc ;==>_StringFormat
Alles anzeigen
EDIT [29.09.2018]
Wie Musashi richtig bemerkt hat, habe ich völlig verpennt, dass der normale Textanteil ja auch geschweifte Klammern enthalten kann.
Ich möchte ein Maskieren von Zeichen durch den Anwender möglichst vermeiden, weil dies dann vom Standardhandling der Funktion abweicht. Ich setz mich mal dran.
EDIT 2 [29.09.2018]
Ich habe mich jetzt dafür entschieden, dieses Problem analog zur Nutzung von Stringbegrenzern zu lösen: Man maskiert geschweifte Klammern einfach mit sich selbst. Also: {{interner String mit geschweiften Klammern}}
EDIT 3 [30.09.2018]
Richtiger Hinweis von Xori: Da im Text sowohl Backslash als auch Prozentzeichen bereits mit Backslash maskiert werden müssen, ist es sinnvoll diese Maskierung zu übernehmen.
Somit: \{interner String mit geschweiften Klammern\}