2012-08-24 11 views
9

string.Format ha firma siguiente métodoCómo validar el formato para el método string.Format

string.Format(format, params, .., .. , ..); 

quiero pasar formato personalizado de cada momento como

string custFormat = "Hi {0} ... {n} "; // I only care about numbers here, and want avoid {abdb} 
string name = "Foo"; 

string message = ProcessMessage(custFormat, name); 

public string ProcessMessage(custFormat, name) 
{ 
    return string.Format(custFormat, name); 
} 

Quiero validar el valor en custFormat antes de pasar a ProcessMessage para evitar excepciones.

+3

Qué idioma ¿Estás trabajando en? DO#? –

+0

Debe etiquetar esta pregunta con el lenguaje de programación en el que está buscando una respuesta. – chucksmash

+0

sí C# string.format – codeSetter

Respuesta

18

Pensemos acerca de esta API, si existe. El objetivo es validar previamente una cadena de formato para asegurarse de que String.Format no se lanzará.

Tenga en cuenta que cualquier cadena que no contiene contiene un formato válido que es una cadena de formato válida, si no intenta insertar ningún reemplazo.

-> Así que tendría que pasar en el número o argumentos que esperamos para reemplazar

Tenga en cuenta que hay un montón de diferentes patrones de formato especialidad, cada uno con un significado específico para los tipos específicos: http://msdn.microsoft.com/en-us/library/system.string.format.aspx

Aunque parece que String.Format no se lanzará si pasa una cadena de formato que no coincide con su tipo de argumento, el formateador no tiene sentido en tales casos. p.ej. String.Format("{0:0000}", "foo")

-> Por lo tanto, una API de este tipo sería realmente útil solo si pasa los tipos de los args también.

Si ya necesitamos pasar en nuestro formato de cadena y una variedad de tipos (al menos), entonces estamos básicamente en la firma de String.Format, entonces ¿por qué no solo usar eso y manejar la excepción? Sería bueno si algo como String.TryFormat existiera, pero que yo sepa, no es así.

Además, la validación previa a través de algunas API, y luego la validación en String.Format en sí no es ideal.

creo que la solución más limpia podría ser la definición de un envoltorio:

public static bool TryFormat(string format, out string result, params Object[] args) 
{ 
    try 
    { 
     result = String.Format(format, args); 
     return true; 
    } 
    catch(FormatException) 
    { 
     return false; 
    } 
} 
-1

Debe usar expresiones regulares para verificar la sintaxis y también puede usar alguna comprobación semántica.

expresión regular debe ser: (*{\d+}*)+

+0

Creo que esto tiene sentido. Voy a tratar ahora. Gracias por tu ayuda. – codeSetter

+2

Esto ni siquiera está cerca. En primer lugar, existe una gran variedad de posibles patrones de formato válidos (http://msdn.microsoft.com/en-us/library/system.string.format.aspx) y esto captura solo lo más simple. En segundo lugar, no considera el número o los argumentos que se reemplazan en absoluto, p. String.Format ("{0} {15}", "test") pasará este patrón pero arrojará. – latkin

0

Mientras que sólo está pasando en 1 argumento, se puede mirar para buscar custFormat{0}. Si no lo encuentras, no es válido.

+0

one arg es solo para demostrar aquí. – codeSetter

+2

'{}' no es el único patrón de formato válido. Hay una gran variedad de patrones válidos. p.ej. '{0: 0000}', '{0: D}', etc. – latkin

+0

Buen punto, solo estaba usando su muestra muy simple para proporcionar una respuesta simple, supongo. – Thelonias

0

Puede validar con try catch, si el formato lo permite, excepto que inicie sesión y detenga el tratamiento.

try 
{ 
    string.Format(custFormat, params, .., .. , ..); 
} 
catch(FormatException ex) 
{ 
    throw ex; 
} 

string message = ProcessMessage(custFormat, name); 
Cuestiones relacionadas