Разработка приложений на языке C#. Полезные настройки. Особые спецификаторы формата, страница 4

Console.WriteLine ("{0:0.00#e000}", double.MinValue);   // -1.798e308

Console.WriteLine ("{0:00.00#e000}", double.MinValue);  // -17.977e307

Console.WriteLine ("{0:0.00#e-0}", -1.0f/int.MaxValue);  // -4.657e-10

Класс NumberFormatInfo и перечисление NumberStyles позволяют управлять способом форматирования числовых значений в зависимости от выбранной культуры или произвольных пожеланий программиста. В .NET различают понятия текущей культуры (current culture) и текущей культуры интерфейса (current uiculture).

Предположим, мы получили по почте строку такую символов: "  (1,234,567.897654)  ". Она содержит лишние пробелы (в начале и в конце) и является записью отрицательного числа, которое принято в западных культурах. Мы хотим преобразовать этот текст в вещественное число, которое при выводе будет опять (автоматически) преобразовано в строку символов, соответствующую уже нашей культуре "–1234567,90". Убедитесь, что следующий фрагмент справляется с этой задачей.

string s = "  (1,234,567.897654)  "; // Хотим эту строку преобразовать в число

NumberFormatInfo info = new NumberFormatInfo();

info.NumberGroupSeparator = ",";     // Указываем разделитель групп (не наша культура)

double d = double.Parse (s,    // Разрешаем (allow) другие отклонения от нашей культуры

  NumberStyles.AllowLeadingSign |

  NumberStyles.AllowDecimalPoint |    NumberStyles.AllowThousands |

NumberStyles.AllowLeadingWhite |    NumberStyles.AllowTrailingWhite |

NumberStyles.AllowParentheses, info);

Console.WriteLine ("{0:F3}", d);       // -1234567,90

//     d = double.Parse(s);

Попробуйте закомментировать какой-либо из allow-стилей, и вы получите исключение. Сбой также произойдет, если вы попытаетесь выполнитьзакомментированный оператор d = double.Parse(s);. Вывод—для разбора строки текста, созданной в другой культуре, надо исользовать Parsing со спецификатором стиля NumberStyles. При обработке денежных строк также много ухищрений, например:

s = "р  -1,234,567.890  ";  // р — это наши, деревянные. Запятые и точки не соответствуют нашей культуре

info.CurrencySymbol = "р";  // Однако, мы заставим компилятор распознать эту строку

d = double.Parse (s, NumberStyles.Any, info);

Console.WriteLine ("{0:F}", d);

Рассмотрим, как работать с кодом культуры. Он задается строкой теста, например: "en-US". Первые две буквы (en) ассоциируются с языком, а вторые (US) — с регионом. Если в данный момент включена наша культура ("ru-RU"), а мы хотим вывести число в формате, соответствующем "зеленым крокодилам", то в методе преобразования ToString надо временно включить их культуру.

CultureInfo culture = new CultureInfo ("en-US"); // Представим, что мы в Америке

s = 12345.ToString ("c", culture);

Console.WriteLine (s);      // $12,345.00

culture = new CultureInfo ("da-DK"); // Теперь представим, что мы в Дании

s = 12345.ToString ("c", culture);

Console.WriteLine (s);      // kr 12.345,00

Дата и время тоже имеют достаточно много вариантов форматирования. Кроме этого, можно выбрать вариант, который зависит (CurrentInfo), или не зависит (InvariantInfo) от текущей культуры. В последнем случае форматирование определяется американской культурой?! Кто создал первый (и последний) компьютер, тот и задает правила игры. Таблица приведена для сведения, а код для того, чтобы вы его выполнили.