2014-09-02 15 views
8

Un ex collega ha scritto questo:Spiegando confusione formato stringa condizionale

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

leggo articoli come questi

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

Ma io non capisco ancora come quel formato lavori. Ovviamente posso vedere l'output ma non capisco questa parte {0:#;;} e la seconda. Voglio fare la stessa cosa per specificare le età (anno, anni ...)

Sono molto curioso di questo formato di stringa. Qualcuno può spiegare questo comportamento? L'autore non lavora più con noi.

+1

[Il '"; "' Separatore di sezione] (http://msdn.microsoft.com/en-us/library/0c899ak8%28v=vs.110%29.aspx#SectionSeparator) – dasblinkenlight

risposta

10

Questo è un custom numeric format string, fondamentalmente - ma piuttosto strano, a dire il vero. In realtà, è due di loro:

#;; 
records;no records;record 

In ogni caso, hai tre sezioni, a causa di avere due (i punti e virgola):

La prima sezione si applica a positivo valori, la seconda sezione si applica ai valori negativi e la terza sezione si applica agli zeri.

La vostra situazione è ulteriormente complicata dallo sviluppatore utilizzando rows - 1 come valore da formattare dalla seconda stringa di formato, quindi è davvero:

  • records se rows è maggiore di 1 (in modo rows - 1 è positivo)
  • no records se rows è uguale a 0 (così rows - 1 è negativo)
  • record se rows è uguale t o 1 (così rows - 1 è zero)

E la prima stringa di formato solo comprende il valore delle rows (dovuta alla #) se rows è positivo. Così il risultato complessivo è:

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

Personalmente avrei sia usato un operatore condizionale per questo, o se/else - utilizzando una stringa di formato numerico personalizzato è "intelligente" nel peggiore dei modi ...

+0

I ... aspetta .. .che cosa? EDIT ... grazie per aver spiegato ulteriormente – DidIReallyWriteThat

+0

Che un uso abbastanza intelligente del formato stringa. È anche importante che solo per i valori positivi venga stampato il numero effettivo (a causa di '# ;;' nel primo formato). – MarcinJuraszek

+0

@CalvinSmith: l'ho modificato ulteriormente: potrebbe essere d'aiuto. –