Jak warunkowo formatować ciąg w .NET?

głosy
30

Chciałbym zrobić jakiś warunek formatowania ciągów. Wiem, że można zrobić warunkowego formatowania liczb i unosi się w następujący sposób:

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

Powyższy kod spowoduje w jednym z trzech formatów jeśli zmienna jest dodatnia, ujemna lub zero.

Chciałbym wiedzieć, czy jest jakiś sposób na wykorzystanie sekcje na argumentach smyczkowych. Na beton, ale contrived przykład, chciałbym być patrząc zastąpić „if” sprawdzić w poniższym kodzie:

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);
}
Utwórz 30/09/2008 o 20:06
źródło użytkownik
W innych językach...                            


7 odpowiedzi

głosy
33

Cóż, można uprościć to trochę z operatorem warunkowym:

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

Lub nawet umieścić go w tym samym oświadczeniu:

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

Czy to Ty jesteś po? Nie sądzę, że można mieć jeden ciąg formatu, który czasami zawiera bity, a czasem nie.

Odpowiedział 30/09/2008 o 20:10
źródło użytkownik

głosy
7

Nie w ramach String.Format (), ale można użyć C # 's operatorów wbudowanych, takich jak:

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

Pomogłoby schludny-up kod.

Odpowiedział 30/09/2008 o 20:10
źródło użytkownik

głosy
3

Chociaż nie zwracając się bezpośrednio OP, to podpada pod tytułem zapytania, jak również.

I często trzeba formatować ciągi z jakimś niestandardowym jednostki, ale w przypadkach, gdy nie mam danych, nie chcę do niczego wyjściowego w ogóle. Używam tego z różnych typów pustych:

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

Na przykład, jeśli mam formatowania temperatur jak „20 ° C”, ale napotyka wartość null, zostanie wydrukowana alternatywny ciąg zamiast „° 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"
Odpowiedział 15/12/2011 o 22:26
źródło użytkownik

głosy
2
string.Format(  (items.Count > 0 ? "Items: {0}; " : "") + "Values {1}"
              , itemList
              , valueList); 
Odpowiedział 30/09/2008 o 20:51
źródło użytkownik

głosy
1

Po prostu nie. Nie mam pojęcia, co oba elementy i wartości w kodzie, ale wierzę, para ta może być traktowana jako podmiot pewnego rodzaju. Zdefiniować ten podmiot jako klasa i zastąpić swoją ToString()metodę, aby powrócić co chcesz. Nie ma absolutnie nic złego w ifcelu podjęcia decyzji, jak sformatować ten ciąg w zależności od jakiegoś kontekstu.

Odpowiedział 10/08/2011 o 17:45
źródło użytkownik

głosy
1

Prawdopodobnie nie jest to co szukasz, ale jak o ...

formatString = (items.Count > 0) ? "Items: {0}; Values: {1}" : "Values: {1}";
Odpowiedział 30/09/2008 o 20:09
źródło użytkownik

głosy
0

Mam nadzieję, że może to zrobić:

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

Niestety, wydaje się, że metoda .ToString () nie podoba się pusty ujemnych i zerowych opcji lub nie mający # lub 0 gdziekolwiek. Zostawię go tu przypadek wskazuje kogoś innego do lepszej odpowiedzi.

Odpowiedział 30/09/2008 o 20:24
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more