2012-08-24 11 views
9

string.Format folgende Methode SignaturWie Format für string.Format Methode zur Validierung

string.Format(format, params, .., .. , ..); 

Ich möchte formatiert werden wie jedes Mal Gewohnheit führen

string custFormat = "Hi {0} ... {n} "; // I only care about numbers here, and want avoid {abdb} 
string name = "Foo"; 

string message = ProcessMessage(custFormat, name); 

public string ProcessMessage(custFormat, name) 
{ 
    return string.Format(custFormat, name); 
} 

möchte ich den Wert in custFormat validieren vor dem Übergeben an ProcessMessage, um eine Ausnahme zu vermeiden.

+3

Welche Sprache sind Sie in der Arbeit? C#? –

+0

Sie sollten diese Frage mit der Programmiersprache versehen, nach der Sie eine Antwort suchen. – chucksmash

+0

ja C# string.format – codeSetter

Antwort

18

Lassen Sie uns über diese API nachdenken, falls sie existiert. Das Ziel besteht darin, eine Formatzeichenfolge vorab zu validieren, um sicherzustellen, dass String.Format nicht ausgelöst wird.

Beachten Sie, dass jede Zeichenfolge, die nicht enthält einen gültigen Format-Steckplatz ist eine gültige Formatzeichenfolge - wenn Sie nicht versuchen, einen Ersatz einzufügen.

-> So würden wir in der Anzahl oder args passieren müssen wir

Hinweis, dass es Tonnen von verschiedenen Spezialformatierungsmuster, die jeweils mit einer bestimmten Bedeutung für bestimmte Arten zu ersetzen erwarten: http://msdn.microsoft.com/en-us/library/system.string.format.aspx

Obwohl es scheint, dass String.Format nicht ausgelöst wird, wenn Sie eine Formatzeichenfolge übergeben, die nicht mit Ihrem Argumenttyp übereinstimmt, wird der Formatierer in solchen Fällen bedeutungslos. z.B. String.Format("{0:0000}", "foo")

-> So eine API wäre wirklich nur nützlich, wenn Sie auch die Arten der Argumente übergeben.

Wenn wir bereits unsere Formatzeichenfolge und ein Array von Typen (zumindest) übergeben müssen, dann sind wir grundsätzlich bei der Signatur String.Format, also warum nicht einfach das verwenden und die Ausnahme behandeln? Es wäre schön, wenn etwas wie String.TryFormat existiert, aber meines Wissens nicht.

Auch über eine API vorab zu validieren, dann ist die erneute Validierung in String.Format selbst nicht optimal.

Ich denke, die sauberste Lösung könnte einen Wrapper zu definieren sein:

public static bool TryFormat(string format, out string result, params Object[] args) 
{ 
    try 
    { 
     result = String.Format(format, args); 
     return true; 
    } 
    catch(FormatException) 
    { 
     return false; 
    } 
} 
-1

Sie sollten reguläre Ausdrücke für die Syntaxprüfung verwenden, und Sie können auch eine semantische Überprüfung verwenden.

Regulärer Ausdruck sollte sein: (*{\d+}*)+

+0

Ich denke, das macht Sinn. Ich werde es jetzt versuchen. Danke für Ihre Hilfe. – codeSetter

+2

Das ist nicht einmal knapp. Erstens gibt es eine riesige Auswahl von verschiedenen möglichen gültigen Formatmustern (http://msdn.microsoft.com/en-us/library/system.string.format.aspx) und dies fängt nur sehr einfach ein. Zweitens berücksichtigt es nicht die Anzahl oder Argumente, die überhaupt ersetzt werden - z. String.Format ("{0} {15}", "test") wird dieses Muster übergeben, aber werfen. – latkin

0

Solange Sie nur in 1 Argument übergeben, können Sie custFormat für {0} aussehen suchen. Wenn Sie es nicht finden, ist es ungültig.

+0

ein arg ist nur hier zu demonstrieren. – codeSetter

+2

'{}' ist nicht das einzige gültige Formatmuster. Es gibt eine große Auswahl an gültigen Mustern. z.B. '{0: 0000}', '{0: D}', usw. – latkin

+0

Guter Punkt, ich habe nur seine sehr einfache Probe verwendet, um eine einfache Antwort zu geben, nehme ich an. – Thelonias

0

Sie können mit try catch validieren, wenn format throw, außer Sie protokollieren Informationen und stoppen die Behandlung.

try 
{ 
    string.Format(custFormat, params, .., .. , ..); 
} 
catch(FormatException ex) 
{ 
    throw ex; 
} 

string message = ProcessMessage(custFormat, name);