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) от текущей культуры. В последнем случае форматирование определяется американской культурой?! Кто создал первый (и последний) компьютер, тот и задает правила игры. Таблица приведена для сведения, а код для того, чтобы вы его выполнили.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.