locked
Как можно использовать форматирование строки для написания чего-либо вроде "{42.00}"? RRS feed

  • Общие обсуждения

  • Поскольку использование управляющих последовательностей для фигурных скобок ведет к странным результатам, подобная попытка не сработает гладко:

    [C#]
    int i = 42;
    string s = String.Format("{{{0:N}}}", i);   //prints '{N}'

    Это вызывает вопрос: как же тогда выписать {42.00}?

    На этот вопрос можно ответить несколькими способами – попробуйте определить самый простой и надежный. . «Простота» подразумевает простоту в написании, а «надежность» - способность работать в различных условиях (чтобы судить о ней, необходимо знать о различных вариантах форматирования строк).

    Три моих варианта:

    1. [C#] int i = 42;
      string s = String.Format("{0}{1:N}{2}", "{", i, "}");   //prints '{42.00}'
    2.  

    3. [C#]
      int i = 42;
      string s = String.Format("{{{0}}}", i.ToString("N")) ;   //prints '{42.00}'
    4.  

    5. [C#]
      int i = 42;
      string s = String.Format("{0:{{0.00}}}", i);   //prints '{42.00}'
    6.  

    Какой из них лучший? Вы, наверное, уже угадали, что вопрос здесь с каверзой. На первый взгляд, вариант 2 кажется наиболее подходящим. В конце концов, его удобнее всего читать (он не включает раздельное форматирование варианта 1) и он куда более надежен, чем вариант 3. (Так получилось, что в данном случае вариант 3 дает идентичный результат, но если изменить культуру на компьютере, результаты могут стать разными. Или, при использовании другого значения «i», скажем, 42000, поведение также будет другим). Так что может показаться, что вариант 2 –– это то, что надо!

    Но будьте осторожны! Вариант 2 –– хороший выбор, если просто использовать вышеприведенное форматирование. Но что если использовать выравнивание по левому краю в строке форматирования, чтобы изменить выводимый результат? Например:

    [C#]
    int i = 42;
    string s = String.Format("{0,-7:N}", i);   //prints '42.00  ', ",-7" left-justifies the string

    Теперь представьте, как будут работать следующие три строки кода: помните, что задача заключается в печати "{42.00}", с пробелами в конце, а не в середине:

    [C#]
    int i = 42;
    string s1 = String.Format("{0}{1,-7:N}{2}", "{", i, "}") ;   //prints '{42.00  }'
    string s2 = String.Format("{{{0,-7}}}", i.ToString("N")) ;   //prints '{42.00  }'
    string s3 = String.Format("{0,-9:{{0.00}}}", i);   //prints '{42.00}  '

    Увы, как можно увидеть, вариант 2 не выдал верного результата. Это сделал только вариант 3! И помните, что при использовании значения 42000, вариант 3 тоже не сработал бы.

    Хорошая новость здесь в том, что вариант 3 надежнее, чем кажется, нужно лишь знать, какую строку нестандартного формата использовать. В данном случае вариант 3 можно улучшить, сделав следующее:

    [C#]
    int i = 42000;
    string s = String.Format("{0,-15:{{#,##0.00}}}", i);   //prints '{42,000.00}     '

    Для связи [Mail]
    • Перемещено Tagore Bandlamudi 3 октября 2010 г. 1:05 MSDN Forums consolidation (От:Форум по .NET Framework)
    18 февраля 2010 г. 11:25
    Модератор