views:

1485

answers:

5

I would like to do some condition formatting of strings. I know that you can do some conditional formatting of integers and floats as follows:

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

The above code would result in one of three formats if the variable is positive, negative, or zero.

I would like to know if there is any way to use sections on string arguments. For a concrete, but contrived example, I would be looking to replace the "if" check in the following code:

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

This is probably not what you're looking for, but how about...

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

Kon
+3  A: 

Not within String.Format(), but you could use C#'s inline operators, such as:

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

This would help tidy-up the code.

C. Lawrence Wenham
+2  A: 

Well, you can simplify it a bit with the conditional operator:

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

Or even include it in the same statement:

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

Is that what you're after? I don't think you can have a single format string which sometimes includes bits and sometimes it doesn't.

Jon Skeet
Not sure why this has been voted down, given that it certainly works... Any voters care to enlighten me? It's always nice to know why people don't like answers - it makes it easier to provide better ones in future.
Jon Skeet
Religion probably.... i'd guess the use of the ternary operator
Quibblesome
A: 

I hoped this could do it:

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

Unfortunately, it seems that the .ToString() method doesn't like the blank negative and zero options or not having a # or 0 anywhere. I'll leave it up here in case it points someone else to a better answer.

Joel Coehoorn
+1  A: 
string.Format(  (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}"
              , itemList
              , valueList);
Mark Cidade
Could you point me to the documentation that specifies the bit about starting at 0 and having no missing numbers?
Adam Tegen
I was mistaken--I was confusing it with the requirement that all placeholder numbers are less than the length of the argument list. Null arguments are okay as they are turned into empty strings.
Mark Cidade