32

文字列の条件フォーマットを行いたいのですが。次のように、整数と浮動小数点数の条件付き書式を設定できることを知っています。

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

上記のコードは、変数が正、負、またはゼロの場合、3つの形式のいずれかになります。

文字列引数のセクションを使用する方法があるかどうか知りたいのですが。具体的ですが、不自然な例として、次のコードの「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に直接対処するわけではありませんが、これも質問のタイトルに該当します。

いくつかのカスタム単位で文字列をフォーマットする必要があることがよくありますが、データがない場合は、何も出力したくありません。私はこれをさまざまなnull許容型で使用します。

/// <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」のような温度をフォーマットしているのにnull値が発生した場合、「°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 に答える