¿Cómo puedo determinar si una cadena formato compuesto no es válida?
-
27-09-2019 - |
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!
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