2014-09-02 21 views
8

ex-współpracownik napisał:Wyjaśniając mylące warunkowego format string

String.Format("{0:#;;} {1:records;no records;record}", rows, rows - 1); 
//Rows is a integer value 

czytam artykuły jak te

Code Project - Custom String Formatting in .NET
MSDN - Custom Numeric Format Strings

Ale ja nadal nie rozumiem, w jaki sposób Format Prace. Oczywiście widzę wyjście, ale nie rozumiem tej części {0:#;;} i drugiej. Chcę zrobić to samo dla określenia wieku (rok, lata ...)

Jestem bardzo ciekawy tego formatu smyczków. Czy ktoś może wyjaśnić to zachowanie? Autor już z nami nie pracuje.

+1

[Separator sekcji ''; '' Rozdział (http://msdn.microsoft.com/en-us/library/0c899ak8%28v=vs.110%29.aspx#SectionSeparator) – dasblinkenlight

Odpowiedz

10

To jest w zasadzie custom numeric format string, ale całkiem dziwny, szczerze mówiąc. W rzeczywistości, to dwa z nich:

#;; 
records;no records;record 

w każdym przypadku, masz trzy sekcje, z powodu posiadania dwóch (The średników):

Pierwsza sekcja dotyczy pozytywny wartości, druga sekcja dotyczy wartości ujemnych, a trzecia sekcja odnosi się do zer.

Twoja sytuacja jest dodatkowo skomplikowana przez autora z wykorzystaniem rows - 1 jako wartość zostać sformatowany przez drugiego ciągu formatu, więc jest to naprawdę:

  • records jeśli rows jest większa niż 1 (tak rows - 1 jest dodatnia)
  • no records jeśli rows jest równe 0 (tak rows - 1 jest ujemna)
  • record jeśli rows jest równy T O 1 (tak rows - 1 wynosi zero)

I pierwszy format string tylko obejmuje wartość rows (ze względu na #) jeżeli rows jest dodatni. Tak ogólny wynik to:

Rows  Result 
    2  2 records (ditto for other values greater than 1) 
    1  1 record 
    0  no records 

Osobiście mam też stosować operator warunkowy na to, czy jeśli/else - przy użyciu niestandardowego formatu ciąg liczbowy jest „mądry” w najgorszy sposób ...

+0

Ja ... czekaj ... .co? EDYTUJ ... dzięki za wyjaśnienie dalszych – DidIReallyWriteThat

+0

To całkiem sprytne użycie formatu smyczkowego. Ważne jest również, że tylko dla wartości dodatnich zostanie wydrukowana aktualna liczba (z powodu "# ;;" w pierwszym formacie). – MarcinJuraszek

+0

@CalvinSmith: Edytowałem to dalej - może to pomóc. –