32

我想做一些字符串的条件格式。我知道您可以对整数和浮点数进行一些条件格式化,如下所示:

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

7 回答 7

37

好吧,您可以使用条件运算符稍微简化一下:

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

这就是你所追求的吗?我认为您不能拥有一个有时包含位有时不包含位的格式字符串。

于 2008-09-30T19:10:48.573 回答
7

不在 String.Format() 中,但您可以使用 C# 的内联运算符,例如:

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

这将有助于整理代码。

于 2008-09-30T19:10:34.750 回答
5

虽然没有直接解决 OP,但这也属于问题标题。

我经常需要使用一些自定义单位来格式化字符串,但是在我没有数据的情况下,我根本不想输出任何东西。我将它与各种可为空的类型一起使用:

/// <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"
于 2011-12-15T21:26:34.830 回答
2
string.Format(  (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}"
              , itemList
              , valueList); 
于 2008-09-30T19:51:18.897 回答
1

只是不要。我不知道您的代码中的项目和值是什么,但我相信,这对可以被视为某种实体。将此实体定义为一个类并覆盖其ToString()方法以返回您想要的任何内容。if根据某些上下文决定如何格式化此字符串绝对没有错。

于 2011-08-10T16:45:50.647 回答
1

这可能不是您要寻找的,但是...

formatString = (items.Count > 0) ? "Items: {0}; Values: {1}" : "Values: {1}";
于 2008-09-30T19:09:14.163 回答
0

我希望这可以做到:

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

不幸的是,.ToString() 方法似乎不喜欢空白的负数和零选项,或者在任何地方都没有 # 或 0。我会把它留在这里,以防它为其他人指出更好的答案。

于 2008-09-30T19:24:56.590 回答