Как условно отформатировать строку в .Net? - PullRequest
31 голосов
/ 30 сентября 2008

Я хотел бы сделать некоторые условия форматирования строк. Я знаю, что вы можете сделать некоторое условное форматирование целых чисел и чисел с плавающей запятой следующим образом:

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

Приведенный выше код приведет к одному из трех форматов, если переменная положительная, отрицательная или равна нулю.

Я хотел бы знать, есть ли способ использовать разделы для строковых аргументов. Для конкретного, но надуманного примера я хотел бы заменить проверку "если" в следующем коде:

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);
}

Ответы [ 7 ]

34 голосов
/ 30 сентября 2008

Ну, вы можете немного упростить это с помощью условного оператора:

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);

Это то, что вы ищете? Я не думаю, что у вас может быть одна строка формата, которая иногда включает биты, а иногда нет.

7 голосов
/ 30 сентября 2008

Не в String.Format (), но вы можете использовать встроенные операторы C #, такие как:

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

Это поможет привести в порядок код.

3 голосов
/ 16 декабря 2011

Не обращаясь непосредственно к ФП, это также относится к названию вопроса.

Мне часто нужно форматировать строки с каким-то пользовательским модулем, но в тех случаях, когда у меня нет данных, я вообще не хочу ничего выводить. Я использую это с различными обнуляемыми типами:

/// <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"
2 голосов
/ 30 сентября 2008
string.Format(  (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}"
              , itemList
              , valueList); 
1 голос
/ 10 августа 2011

Просто не надо. Я понятия не имею, каковы элементы и значения в вашем коде, но я считаю, что эту пару можно рассматривать как сущность некоторого вида. Определите эту сущность как класс и переопределите ее метод ToString(), чтобы он возвращал все, что вы хотите. Нет ничего плохого в том, чтобы иметь if для решения, как форматировать эту строку в зависимости от некоторого контекста.

1 голос
/ 30 сентября 2008

Это, вероятно, не то, что вы ищете, а как насчет ...

formatString = (items.Count > 0) ? "Items: {0}; Values: {1}" : "Values: {1}";
0 голосов
/ 30 сентября 2008

Я надеялся, что это может сделать это:

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

К сожалению, похоже, что метод .ToString () не любит пустые отрицательные и нулевые параметры или не имеет ни #, ни 0. Я оставлю это здесь на всякий случай, если он укажет кому-то на лучший ответ.

...