Как условно форматировать строку в .Net?
Я хотел бы сделать некоторое форматирование строк строк. Я знаю, что вы можете сделать условное форматирование целых чисел и поплавков следующим образом:
Int32 i = 0;
i.ToString("$#,##0.00;($#,##0.00);Zero");
Приведенный выше код привел бы к одному из трех форматов, если переменная положительна, отрицательна или равна нулю.
Я хотел бы знать, есть ли способ использовать разделы в строковых аргументах. Для конкретного, но надуманного примера, я бы хотел заменить проверку "if" в следующем коде:
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);
}
Ответы
Ответ 1
Ну, вы можете немного упростить его с условным оператором:
string formatString = items.Count > 0 ? "Items: {0}; Values: {1}" : "Values: {1}";
return string.Format(formatString, itemList, valueList);
Или даже включить его в тот же оператор:
return string.Format(items.Count > 0 ? "Items: {0}; Values: {1}" : "Values: {1}",
itemList, valueList);
Это то, что тебе нужно? Я не думаю, что у вас может быть одна строка формата, которая иногда включает в себя биты, а иногда и нет.
Ответ 2
Не внутри String.Format(), но вы можете использовать встроенные операторы С#, например:
return items.Count > 0
? String.Format("Items: {0}; Values: {1}", itemList, valueList)
: String.Format("Values: {0}", valueList);
Это поможет убрать код.
Ответ 3
Не обращаясь непосредственно к OP, это также относится к заголовку вопроса.
Мне часто приходится форматировать строки с помощью какой-то пользовательской единицы, но в тех случаях, когда у меня нет данных, я вообще ничего не хочу выводить. Я использую это с различными типами NULL:
/// <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);
}
Например, если я форматирую температуру как "20 ° C", но столкнувшись с нулевым значением, он будет печатать альтернативную строку вместо "° 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"
Ответ 4
string.Format( (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}"
, itemList
, valueList);
Ответ 5
Это, вероятно, не то, что вы ищете, но как насчет...
formatString = (items.Count > 0) ? "Items: {0}; Values: {1}" : "Values: {1}";
Ответ 6
Просто не надо. Я понятия не имею, какие элементы и ценности в вашем коде, но я считаю, что эту пару можно рассматривать как сущность какого-то рода. Определите этот объект как класс и переопределите его метод ToString()
, чтобы вернуть все, что хотите. Нет абсолютно ничего плохого в том, что if
для принятия решения о том, как отформатировать эту строку в зависимости от некоторого контекста.
Ответ 7
Я надеялся, что это возможно:
return String.Format(items.ToString(itemList + " ;;") + "Values: {0}", valueList);
К сожалению, кажется, что метод .ToString() не любит пустые отрицательные и нулевые параметры или не имеет нигде или #. Я оставлю это здесь, если он укажет кому-то еще на лучший ответ.