2008-09-30 14 views
30

Me gustaría hacer algunas formaciones de condiciones de cadenas. Yo sé que usted puede hacer algo de formato condicional de los enteros y los flotadores de la siguiente manera:Cómo formatear condicionalmente una cadena en .Net?

Int32 i = 0; 
i.ToString("$#,##0.00;($#,##0.00);Zero"); 

El código anterior podría dar lugar a uno de los tres formatos de si la variable es positivo, negativo o cero.

Me gustaría saber si hay alguna forma de usar secciones en argumentos de cadenas. Para un hormigón, pero artificial ejemplo, estaría buscando para reemplazar el "si" comprobar en el siguiente código:

string MyFormatString(List<String> items, List<String> values) 
{ 
    string itemList = String.Join(", " items.ToArray()); 
    string valueList = String.Join(", " values.ToArray()); 

    string formatString; 

    if (items.Count > 0) 
    //this could easily be: 
    //if (!String.IsNullOrEmpty(itemList)) 
    { 
     formatString = "Items: {0}; Values: {1}"; 
    } 
    else 
    { 
     formatString = "Values: {1}"; 
    } 

    return String.Format(formatString, itemList, valueList); 
} 

Respuesta

1

Esto probablemente no es lo que estás buscando, pero ¿qué tal ...

formatString = (items.Count > 0) ? "Items: {0}; Values: {1}" : "Values: {1}"; 
7
No

dentro String.Format(), pero se puede usar operadores en línea de C# 's, tales como:

return items.Count > 0 
     ? String.Format("Items: {0}; Values: {1}", itemList, valueList) 
     : String.Format("Values: {0}", valueList);   

Esto ayudaría ordenada en marcha el código.

33

Bueno, puede simplificarlo un poco con el operador condicional:

string formatString = items.Count > 0 ? "Items: {0}; Values: {1}" : "Values: {1}"; 
return string.Format(formatString, itemList, valueList); 

O incluso incluirlo en la misma declaración:

return string.Format(items.Count > 0 ? "Items: {0}; Values: {1}" : "Values: {1}", 
        itemList, valueList); 

es eso lo que está buscando? No creo que puedas tener una sola cadena de formato que algunas veces incluye bits y otras no.

+4

No estoy seguro de por qué esto ha sido rechazado, dado que ciertamente funciona ... ¿A los votantes les importa que me iluminen?Siempre es bueno saber por qué a las personas no les gustan las respuestas, hace que sea más fácil proporcionar mejores en el futuro. –

+2

Religión probablemente ... supongo que el uso del operador ternario – Quibblesome

+0

¿Simplificar? Absolutamente jajaja Usar ternary 'if' en este contexto es absolutamente extraño. 1. ¿Qué pasa si hay un tercer caso? 2. ¿Qué logras con este enfoque - 2 líneas de código más corto? – agibalov

0

me esperaba esto podría hacerlo:

return String.Format(items.ToString(itemList + " ;;") + "Values: {0}", valueList); 

Por desgracia, parece que el método ToString() no le gustan las opciones en blanco negativos y cero o que no tengan un # o 0 en cualquier lugar. Lo dejaré aquí en caso de que apunte a otra persona a una mejor respuesta.

2
string.Format( (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}" 
       , itemList 
       , valueList); 
+0

¿Podría indicarme la documentación que especifica el bit sobre comenzar en 0 y no tener números faltantes? –

+0

Estaba equivocado. Estaba confundiéndolo con el requisito de que todos los números de marcador de posición sean menores que la longitud de la lista de argumentos. Los argumentos nulos están bien ya que se convierten en cadenas vacías. –

1

Just do not. No tengo idea de cuáles son los elementos y valores en tu código, pero creo que este par podría tratarse como una entidad de algún tipo. Defina esta entidad como una clase y anule su método ToString() para devolver lo que desee. No hay absolutamente nada de malo en tener if para decidir cómo formatear esta cadena dependiendo de algún contexto.

3

Si bien no se dirige al OP directamente, esto también cae bajo el título de la pregunta.

Con frecuencia necesito formatear cadenas con alguna unidad personalizada, pero en los casos en que no tengo datos, no deseo generar nada. Utilizo este con varios tipos anulables:

/// <summary> 
/// Like String.Format, but if any parameter is null, the nullOutput string is returned. 
/// </summary> 
public static string StringFormatNull(string format, string nullOutput, params object[] args) 
{ 
    return args.Any(o => o == null) ? nullOutput : String.Format(format, args); 
} 

Por ejemplo, si estoy formateo temperaturas como "20 ° C", pero encuentro con un valor nulo, se imprimirá una cadena alternativa en lugar de "° C".

double? temp1 = 20.0; 
double? temp2 = null; 

string out1 = StringFormatNull("{0}°C", "N/A", temp1); // "20°C" 
string out2 = StringFormatNull("{0}°C", "N/A", temp2); // "N/A" 
Cuestiones relacionadas