2010-04-16 9 views
5

Per the documentation, String.Format arrojará FormatException si (A) la cadena de formato no es válida o (B) la cadena de formato contiene un índice que no se puede encontrar en la matriz args.¿Cómo puedo determinar si una cadena de formato compuesto no es válida?

Quiero ser capaz de determinar qué (si cualquiera) de esas condiciones falla en cualquier cadena arbitraria y matriz de argumentos.

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

+0

¿Está buscando una mayor mensaje de falla específica? ¿Como un mensaje de "no parece un número"? – SqlRyan

+0

La propiedad del mensaje será diferente. No lo analice, solo demuéstralo. –

+0

@rwmnau No estoy seguro de lo que quiere decir con un mensaje de "no parece un número", pero no necesito saber nada más específico que qué condición falló. – Tinister

Respuesta

2

seguimiento a 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 sentir el cual (por mensajes de usuario o registro), entonces podría usar un try catch como qor72 sugerido, y verificar con qué comienza el mensaje de error. Además, si usted necesita para capturar lo que era la cadena de formato, y cuáles fueron los argumentos, 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: Agregado de la simple expresión regular para contar las fichas de formato. Podría ayudar ...

Espero que esto ayude. ¡Buena suerte!

+0

Gracias por su esfuerzo. El manejo de excepciones para el flujo de control no es ideal, pero al menos puedo inspeccionar el mensaje en el objeto de excepción. – Tinister

+1

Sin embargo, su expresión regular no funcionará, ya que no tiene en cuenta el escape de llaves o el uso de alineación (por ejemplo, '{0,5}') o un componente de formato (por ejemplo, '{0: d}'). Intenté seguir ese camino también, pero descubrí que estas cadenas de formato son en realidad bastante complicadas. Esperaba que algo exponga esta complicación en lugar de que yo lo rehaga todo, pero bueno. – Tinister

+0

Sí, mi expresión regular fue para el caso más simple, y estoy completamente de acuerdo con usted en las excepciones y el flujo de control. Es lamentable que el framework .net a menudo lo obligue a usar excepciones. – Audie

1

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

+0

No me di cuenta de esto, gracias. – Tinister

0

¿Y no quieres hacer ...?

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

No, esto no me dice qué condición falló. – Tinister

0

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

/// <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, ver http://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx

Cuestiones relacionadas