web-dev-qa-db-ja.com

.Netで文字列を条件付きでフォーマットする方法は?

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

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

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

文字列引数のセクションを使用する方法があるかどうか知りたいのですが。具体的には、contrivedの例では、次のコードの「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);
}
31
Adam Tegen

条件演算子を使用すると、少し単純化できます。

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

それはあなたが求めているものですか?ビットを含む場合と含まない場合がある単一の形式の文字列を持つことはできないと思います。

35
Jon Skeet

String.Format()内ではありませんが、次のようなC#のインライン演算子を使用できます。

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

これは、コードを整理するのに役立ちます。

7
Chris Wenham

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"
3
JYelton
string.Format(  (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}"
              , itemList
              , valueList); 
2
Mark Cidade

これはおそらくあなたが探しているものではありませんが、どうですか...

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

しないでください。コード内の項目と値の両方が何であるかはわかりませんが、このペアはある種のエンティティとして扱うことができると思います。このエンティティをクラスとして定義し、そのToString()メソッドをオーバーライドして、必要なものを返します。コンテキストに応じてこの文字列をフォーマットする方法を決定するためにifを使用しても、まったく問題はありません。

1
Andrey Agibalov

私はこれがそれを行うことができることを望みました:

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

残念ながら、.ToString()メソッドは、空白の負のオプションとゼロオプションが気に入らないか、どこにも#または0がないようです。他の誰かがより良い答えを示した場合に備えて、ここに残しておきます。

0
Joel Coehoorn