2010-04-16 19 views
5

Per the documentation, String.Format wird eine FormatException werfen, wenn entweder (A) die Formatzeichenfolge ungültig ist oder (B) die Formatzeichenfolge einen Index enthält, der nicht im Array args gefunden werden kann.Wie kann ich feststellen, ob eine zusammengesetzte Formatzeichenfolge ungültig ist?

Ich möchte in der Lage sein, zu bestimmen, welche (wenn entweder) diese Bedingungen nicht auf jeder beliebigen Zeichenfolge und Array von Argumenten.

Gibt es etwas, das für mich tun? Vielen Dank!

+0

Suchen Sie eine spezifische Fehlermeldung? Wie eine "sieht nicht wie eine Nummer aus" Nachricht? – SqlRyan

+0

Die Message-Eigenschaft wird anders sein. Parsiere es nicht, zeige es einfach. –

+0

@rwmnau Ich bin mir nicht sicher, was Sie mit einer "'sieht nicht wie eine Nummer' Nachricht", aber ich brauche nichts genauer zu wissen, als welche Bedingung fehlgeschlagen ist. – Tinister

Antwort

2

Folgen zu gbogumil Antwort auf, im ersten Fall erhalten Sie:

"Input string was not in a correct format." 

und in der zweiten, erhalten Sie:

"Index (zero based) must be greater than or equal to 
zero and less than the size of the argument list." 

Wenn Sie erfassen müssen, die (für Benutzer messaging oder logging), dann könnten Sie einen try catch wie qor72 vorgeschlagen verwenden, und prüfen Sie, wo die Fehlermeldung beginnt. Darüber hinaus müssen, wenn Sie erfassen, was das Format-String war, und was die args waren, müssen Sie so etwas wie dies tun:

 string myStr = "{0}{1}{2}"; 
     string[] strArgs = new string[]{"this", "that"}; 
     string result = null; 

     try { result = string.Format(myStr, strArgs); } 

     catch (FormatException fex) 
     { 
      if (fex.Message.StartsWith("Input")) 
       Console.WriteLine 
        ("Trouble with format string: \"" + myStr + "\""); 
      else 
       Console.WriteLine 
        ("Trouble with format args: " + string.Join(";", strArgs)); 
      string regex = @"\{\d+\}"; 
      Regex reg = new Regex(regex, RegexOptions.Multiline); 
      MatchCollection matches = reg.Matches(myStr); 
      Console.WriteLine 
       ("Your format has {0} tokens and {1} arguments", 
       matches.Count, strArgs.Length); 

     } 

EDIT: Added die einfache regex Format-Token zählen. Könnte helfen ...

Hoffnung, das hilft. Viel Glück!

+0

Danke für Ihre Mühe. Die Verwendung der Ausnahmebehandlung für den Kontrollfluss ist nicht ideal, aber zumindest kann ich die Nachricht auf dem Ausnahmeobjekt untersuchen. – Tinister

+1

Ihre regex werden nicht funktionieren, aber da es nicht Rechnung trägt Zahnspange oder mit Ausrichtung (z '{0,5}') oder ein Format Komponente (z '{0: d} ') zu entkommen. Ich habe versucht, auch diesen Pfad zu gehen, fand aber heraus, dass diese Formatzeichenfolgen ziemlich kompliziert sind. Ich hatte gehofft, dass etwas diese Komplikation enthüllen würde, anstatt dass ich alles neu mache, aber naja. – Tinister

+0

Ja, meine Regex war für den einfachsten Fall, und ich stimme Ihnen völlig zu Ausnahmen und Kontrollfluss zu. Es ist bedauerlich, dass das .NET-Framework Sie häufig dazu zwingt, Ausnahmen zu verwenden. – Audie

1

Die Formatnachrichteneigenschaft wird zu einer deutlichen Botschaft in jedem dieser Fälle eingestellt.

+0

Ich habe das nicht erkannt, danke. – Tinister

0

Und Sie wollen nicht zu tun ...?

works = true; 
try { 
    String.Parse(Format, ObjectArray); 
} catch FormatException { 
works = false; } 
+0

Nein, dies sagt mir nicht, welche Bedingung fehlgeschlagen ist. – Tinister

0

habe ich vor kurzem die folgenden regulären unten Ausdruck der zusammengesetzten Format-Strings in allen unseren Ressourcen zu validieren Dateien

/// <summary> 
    /// The regular expression to get argument indexes from a composed format string 
    /// </summary> 
    /// <remarks> 
    /// example   index alignment formatString 
    /// {0}    0  
    /// {1:d}   1     d 
    /// {2,12}   2  12 
    /// {3,12:#}  3  12   # 
    /// {{5}}   
    /// {{{6}}}   6 
    /// </remarks> 
    private static readonly Regex ComposedFormatArgsRegex = 
     new Regex(@"(?<!(?<!\{)\{)\{(?<index>\d+)(,(?<alignment>\d+))?(:(?<formatString>[^\}]+))?\}(?!\}(?!\}))", 
      RegexOptions.Compiled | RegexOptions.ExplicitCapture); 

Weitere Informationen zum Verbund formatiert Strings finden http://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx

Verwandte Themen