Frage

Per Dokumentation wird String.Format einen FormatException werfen, wenn entweder ( A) das Format Zeichenfolge ungültig ist oder (B) der Format-String enthält einen Index, der nicht in der args Array gefunden werden.

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? Dank!

War es hilfreich?

Lösung

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 Sinn müssen die (für Benutzer-Messaging oder Protokollierung), dann könnte man versuchen catch verwenden wie qor72 vorgeschlagen, und die Prüfung für das, was die Fehlermeldung beginnt mit. Darüber hinaus, wenn Sie erfassen müssen, 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: Hinzugefügt die einfache regex Format-Token zu zählen. Might Hilfe ...

Hope, das hilft. Viel Glück!

Andere Tipps

Die Formatnachrichteneigenschaft wird auf eine eindeutige Nachricht in jedem dieser Fälle.

Und Sie wollen nicht zu tun ...?

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

Ich habe vor kurzem den folgenden regulären Ausdruck unter den zusammengesetzten Format-Strings in allen unseren Ressourcen-Dateien zu validieren

    /// <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 über Composite formatiert Strings finden Sie unter http://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top