2013-04-17 12 views
5

uzyskując następujące przykłady:dynamiczny String.Format zależności od params

string amountDisplay = presentation.Amount == 1 ? "" : String.Format("{0} x ", presentation.Amount); 

Czy mimo użyć String.Format więc formatów w zależności od właściwości bez konieczności zrobić stan „value” parametrów ?

inny przypadek użycia:

String.Format("({0}) {1}-{2}", countryCode, areaCode, phonenumber); 

jeśli mam tylko phonenumber, chciałbym skończyć z czymś takim „() -5555555”, co nie jest pożądane.

innym przypadku użycia:

String.Format("my {0} has {1} cat[s]", "Aunt", 3) 

w tym wypadku, że tutaj obejmuje S w [], jeśli wartość> 1 dla przykładu.

Czy istnieje jakaś czarna "składnia" String.Format, która usuwa części kodu w zależności od wartości parametrów lub wartości null?

Dzięki.

+0

Możliwy duplikat http://stackoverflow.com/questions/154483/how-to-conditionally-format-a-string-in-net – mickfold

+1

Można zrobić warunkowe na numery, które nie dyskryminuje dodatni, ujemny i zero - http://msdn.microsoft.com/en-us/library/0c899ak8.aspx#SectionSeparator – eulerfx

+0

@eulerfx Twój komentarz powinien być odpowiedzią. Dokładnie o to tutaj pytałem, czy jest jakiś sposób, aby to zrobić i udowodnisz doskonale. Inne rozwiązania są w porządku, ale są hackami, twoja jest to, co nazwałbym prawdziwą odpowiedzią na to pytanie. Możesz ją opublikować jako odpowiedź, więc mogę wybrać je jako właściwą. –

Odpowiedz

0

Spróbuj użyć operatora warunkowego:

string str = "my {0} has {1} cat" + ((value > 1) ? "s" : ""); 

str = String.Format(str, "Aunt", value); 
0

tylko rozwiązuje ten drugi problem, ale:

int x = 3; 
String.Format("my {0} has {1} cat{2}", "Aunt", x, x > 1 ? "s" : ""); 
2

Niezupełnie. Możesz zhackować niektóre rzeczy w liczbie mnogiej, oczywiście, ale nie będzie to ogólne rozwiązanie pasujące do wszystkich twoich przypadków użycia.

Należy sprawdzić poprawność danych wejściowych niezależnie. Jeśli spodziewasz się, że areaCode nie będzie mieć wartości NULL, a jest to typ zerowy, taki jak string, wykonaj kilka sprawdzeń na początku metody. Na przykład:

public string Foo(string countryCode, string areaCode, string phoneNumber) 
{ 
    if (string.IsNullOrEmpty(countryCode)) throw new ArgumentNullException("countryCode"); 
    if (string.IsNullOrEmpty(areaCode)) throw new ArgumentNullException("areaCode"); 
    if (string.IsNullOrEmpty(phoneNumber)) throw new ArgumentNullException("phoneNumber"); 

    return string.Format(......); 
} 

To nie jest zadaniem UI, aby zrekompensować błąd sprawdzania poprawności na danych wejściowych użytkownika. Jeśli dane są błędne lub ich brakuje, nie kontynuuj. Spowoduje to tylko dziwne błędy i mnóstwo bólu na drodze.

1

Możesz również wypróbować usługę PluralizationServices. Coś takiego:

using System.Data.Entity.Design.PluralizationServices; 

string str = "my {0} has {1} {3}"; 
PluralizationService ps = PluralizationService.CreateService(CultureInfo.GetCultureInfo("en-us")); 
str = String.Format(str, "Aunt", value, (value > 1) ? ps.Pluralize("cat") : "cat"); 
Powiązane problemy