Reputation: 25897
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);
}
Upvotes: 33
Views: 33187
Reputation: 27441
This is probably not what you're looking for, but how about...
formatString = (items.Count > 0) ? "Items: {0}; Values: {1}" : "Values: {1}";
Upvotes: 0
Reputation: 36512
While not addressing the OP directly, this does fall under the question title as well.
I frequently need to format strings with some custom unit, but in cases where I don't have data, I don't want to output anything at all. I use this with various nullable types:
/// <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);
}
For example, if I am formatting temperatures like "20°C", but encounter a null value, it will print an alternate string instead of "°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"
Upvotes: 5
Reputation: 7694
Just don't. I have no idea what are both the items and values in your code, but I believe, this pair could be treated as an entity of some kind. Define this entity as a class and override its ToString()
method to return whatever you want. There's absolutely nothing wrong with having if
for deciding how to format this string depending on some context.
Upvotes: 1
Reputation: 99957
string.Format( (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}"
, itemList
, valueList);
Upvotes: 2
Reputation: 415820
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.
Upvotes: 0
Reputation: 1500675
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.
Upvotes: 37
Reputation: 24017
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.
Upvotes: 6