Pregunta

por la documentación , String.Format arrojará un FormatException si cualquiera ( a) la cadena de formato no es válido o (B) la cadena de formato contiene un índice que no se puede encontrar en la matriz args.

Quiero ser capaz de determinar cual (si tampoco) de esas condiciones fallan en cualquier cadena arbitraria y matriz de argumentos.

¿Hay algo que pueda hacer eso por mí? Gracias!

¿Fue útil?

Solución

Seguimiento de la respuesta de gbogumil, en el primer caso se obtiene:

"Input string was not in a correct format."

y en el segundo, se obtiene:

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

Si necesita sentido, que (para mensajes de usuario o iniciar sesión), entonces se podría usar un intento de captura como qor72 sugirió, y cheque por lo que el mensaje de error comienza con. Además, si usted necesita para capturar lo que era la cadena de formato, y cuáles fueron los argumentos, se tendrá que hacer algo como esto:

        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: Se ha añadido la sencilla expresión regular para contar las fichas de formato. Ayuda podría ...

Espero que esto ayude. Buena suerte!

Otros consejos

La propiedad de mensaje FormatException se establece en un mensaje distinto en cada uno de esos casos.

Y usted no quiere hacer ...?

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

Recientemente he usado la siguiente expresión regular a continuación para validar las cadenas de formato compuestas en todos nuestros archivos de recursos

    /// <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);

Para obtener más información sobre las cadenas con formato compuestas, consulte http://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top