2010-07-01 10 views
7

Estoy intentando aislar (para fines de localización) el formato de algunos mensajes. En uno de los casos, tengo varios parámetros, algunos de los cuales pueden ser una cadena vacía. Un ejemplo es, probablemente, pidió aquí ....String.Format hay una manera sencilla de agregar paréntesis alrededor de un valor de cadena, si no es nulo o vacío

Si los parámetros son Parámetro uno y Parámetro dos entonces yo quiero que el resultado sea Algunos mensaje de parámetros de un (Parámetro dos).

Si los parámetros son Parámetro uno y String.Empty entonces yo quiero que el resultado sea algún parámetro mensaje de una

Si Parámetro dos fue un valor numérico, entonces yo podría utilizar algo como:

String.Format("Test {0}{1:' ('#')'}", "Parameter one", 12);

Esto funciona como yo esperaría - especialmente si el segundo parámetro es null la salida es solo parámetro de prueba uno.

Desafortunadamente (todavía) no he encontrado una opción similar que trabaja con parámetros de cadena. ¿Hay alguno?

Aclaración: Soy plenamente consciente de las numerosas formas de obtener el resultado que necesito en el código. Específicamente, quiero saber si hay un mecanismo integrado similar para las cadenas al numérico que se muestra arriba.

+0

Aparte de las pruebas explícitamente 'String.IsNullOrEmpty', no puedo pensar en nada que serías capaz de hacer en línea . – ChrisF

Respuesta

4

Siempre se puede intentar escribir su propio formateador cadena personalizada mediante la implementación de IFormatProvider and ICustomFormatter

continuación, se invoca como

var stringValue = string.Format(new NewCustomStringFormatInfo(), 
    "Test {0}{1:' ('#')'}", "Parameter one", 12) 
+0

¡Ooh! Me gusta esa idea. No es la opción incorporada que esperaba, pero me ahorraría repetirme cuando necesito una funcionalidad similar en otro lugar. –

+0

Esta es probablemente la mejor respuesta, así que la estoy marcando como tal ... La mención de honor también debe dirigirse a ChrisF, que dio la respuesta más precisa a la pregunta que tenía la intención de formular (es decir, no hay un mecanismo listo para usar)) En mi opinión, esta es la mejor respuesta porque me permite implementar la operación requerida en un solo lugar (el formateador personalizado) y reutilizarla. La sugerencia del método de extensión de CodeMonkey4hire también es buena, pero no tan adecuada para mis necesidades actuales. –

+0

Las otras respuestas deberían ser de gran ayuda para darte la solución sobre cómo codificar lo que se ejecutará en el formato cadena de información. –

0
var s = System.String.IsNullOrEmpty(param2) ? string.Format(...) : string.Format(...) 
+0

Lamentablemente, aunque eso funcionaría, no es lo que estaba buscando, ya que necesitaría pasar por aros similares cada vez que necesitaba un resultado similar. –

2

depende de su situación, pero que podría ser

string.Format(yourFormatString, paramOne, paramTwo).Replace("()", ""); 

No hay garantías, ya que no es infalible y hace la gran suposición de que su La cadena resultante solo tendría "()" si paramTwo estaba vacío.

+0

Sí, ciertamente podría (y probablemente debería) hacer algo así. Me pareció extraño que aparentemente hubiera un mecanismo para agregar formato adicional para los valores numéricos, mientras que no había para los de cadena. Gracias por la sugerencia. –

1

A menos que se define una función que encierra un valor entre paréntesis, no puedo ver cómo lo hace en línea?

Un ejemplo sencillo:

string.Format("Some message {0} {1}", "Parameter one", EncloseInParenthsisIfNotEmpty("")) 

public string EncloseInParenthsisIfNotEmpty(string input) 
{ 
    if (string.IsNullOrEmpty(input)) return ""; 
    return string.Format("({0})", input); 
} 
2

Usted podría crear un método de extensión para ayudar a manejar esto y que sea un poco más concisa.

public static string SomeWellNamedExtension(this string s) 
{ 
    if(string.IsNullOrEmpty(s)) 
     return ""; 

    return string.Format("({0})", s); 
} 

Este método manejará la comprobación nula/vacía y los parens. Es un método bastante especializado, por lo que no es útil en casi ningún otro lugar. Pero entonces su código sería como:

string.Format("Test {0}{1}, paramOne, paramTwo.SomeWellNamedExtension()); 

Sin embargo, ymmv. Esto afectará a su cadena de formato porque los parens ya no son su responsabilidad.No puedo pensar en muchas maneras súper elegantes de manejar el caso de uso con el que estás hablando.

0

Usted puede escribir su propio envoltorio de String.Format (no probado):

string MyFormat(string format, params object[] args) 
{ 
    object[] newArgs = new object[args.Length]; 
    for(int i=0; i<args.Length; i++) 
    { 
    if(args[i] is string) 
    { 
     newArgs[i] = String.IsNullOrEmpty(args[i] as string) ? "" : string.Format("({0})", args[i]); 
    } 
    //numeric cases etc 
    else 
    { 
     newArgs[i]=args[i]; 
    } 
    } 
    return string.Format(format, newArgs); 
} 
Cuestiones relacionadas