c# - ultimo - Cómo formatear condicionalmente una cadena en.Net?
replace c# varios caracteres (7)
Me gustaría hacer algunas formaciones de condición de cadenas. Sé que puedes hacer un formateo condicional de enteros y flotantes de la siguiente manera:
Int32 i = 0;
i.ToString("$#,##0.00;($#,##0.00);Zero");
El código anterior resultaría en uno de tres formatos si la variable es positiva, negativa o cero.
Me gustaría saber si hay alguna forma de usar secciones en argumentos de cadenas. Para un ejemplo concreto, pero artificial , estaría buscando reemplazar la verificación "si" 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);
}
Bueno, puedes 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 buscas? No creo que puedas tener una sola cadena de formato que algunas veces incluye bits y otras no.
Esperaba que esto pudiera hacerlo:
return String.Format(items.ToString(itemList + " ;;") + "Values: {0}", valueList);
Desafortunadamente, parece que al método .ToString () no le gustan las opciones en blanco negativas y cero o no tener un # o 0 en cualquier lugar. Lo dejaré aquí en caso de que apunte a otra persona a una mejor respuesta.
No dentro de String.Format (), pero podría usar los operadores en línea de C #, tales como:
return items.Count > 0
? String.Format("Items: {0}; Values: {1}", itemList, valueList)
: String.Format("Values: {0}", valueList);
Esto ayudaría a ordenar el código.
Probablemente esto no sea lo que estás buscando, pero ¿qué tal ...
formatString = (items.Count> 0)? "Elementos: {0}; Valores: {1}": "Valores: {1}";
string.Format( (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}"
, itemList
, valueList);
Simplemente no lo hagas 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.
Si bien no se dirige directamente al OP, también cae bajo el título de la pregunta.
Con frecuencia necesito formatear cadenas con alguna unidad personalizada, pero en los casos en los que no tengo datos, no deseo generar ningún resultado. Lo uso con varios tipos de nulos:
/// <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 formateando temperaturas como "20 ° C", pero encuentro un valor nulo, 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"