2014-09-02 4 views
8

Бывший сотрудник написал:Объясняя запутанную условный формат строки

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

Я читал статьи, как эти

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

Но я до сих пор не понимаю, как этот формат работает. Очевидно, я вижу выход, но я не понимаю эту часть {0:#;;}, а вторую. Я хочу сделать то же самое для указания возраста (год, годы ...)

Мне очень любопытно этот формат строки. Может ли кто-нибудь объяснить это поведение? Автор больше не работает с нами.

+1

[Разделитель разделов] (http://msdn.microsoft.com/en-us/library/0c899ak8%28v=vs.110%29.aspx#SectionSeparator) – dasblinkenlight

ответ

10

Это custom numeric format string, в основном - но довольно странный, если быть честным. На самом деле, это два из них:

#;; 
records;no records;record 

В каждом случае, у вас есть три раздела, из-за наличия двух (полу-колонов):

Первый раздел относится к положительным значения, второй раздел применяется к отрицательным значениям, а третий раздел относится к нулям.

Ваша ситуация осложняется еще и разработчиком с использованием rows - 1 в качестве значения для отформатирована на второй строке формата, так что это на самом деле:

  • records если rows больше 1 (так rows - 1 положительна)
  • no records, если rows равно 0 (так rows - 1 отрицательный)
  • record, если rows равно т O 1 (так rows - 1 равен нулю)

И первая строка формата только включает значение rows (из-за #), если rows положительна. Таким образом, общий результат:

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

Лично я бы либо использовал условный оператор для этого, или если/иначе - с помощью пользовательского числовая строка формата является «умной» в самом худшем способе ...

+0

Я ... жду .. .какие? EDIT ... спасибо за объяснение далее – DidIReallyWriteThat

+0

Это довольно умное использование строкового формата. Важно также, что только для положительных значений будет напечатано фактическое число (из-за '# ;;' в первом формате). – MarcinJuraszek

+0

@CalvinSmith: Я отредактировал его дальше - это может помочь. –