Friday, February 11, 2011

How to Conditionally Format a String in .Net?

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);
}
  • This is probably not what you're looking for, but how about...

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

    From Kon
  • 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.

  • 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.
    Quibblesome : Religion probably.... i'd guess the use of the ternary operator
    From Jon Skeet
  • 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.

  • string.Format(  (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}"
                  , itemList
                  , valueList);
    
    Adam Tegen : Could you point me to the documentation that specifies the bit about starting at 0 and having no missing numbers?
    Mark Cidade : 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.

0 comments:

Post a Comment