Полное руководство. С# 4.0
Шрифт:
который выводит следующий результат. Деление 10/3 дает: 3.33333333333333
В одних случаях такого вывода может оказаться достаточно, а в других — он про сто недопустим. Например, в финансовых расчетах после десятичной точки принято указывать лишь два десятичных разряда.
Для управления форматированием числовых данных служит другая форма метода WriteLine, позволяющая встраивать информацию форматирования, как показано ниже. WriteLine("форматирующая строка", arg0, arg1, ... , argN);
В этой форме аргументы метода WriteLine разделяются запятой, а не знаком +. А форматирующая строка состоит из двух элементов: обычных печатаемых символов, предназначенных для вывода в исходном виде, а также спецификаторов формата. По следние указываются в следующей общей форме: {argnum, width: fmt}
где argnum — номер выводимого
Начнем с самого простого примера. При выполнение оператора Console.WriteLine("В феврале {0} или {1} дней.", 28, 29);
получается следующий результат. В феврале 28 или 29 дней
Как видите, значение 28 подставляется вместо спецификатора {0}, а значение 29 — вместо спецификатора {1}. Следовательно, спецификаторы формата обозначают ме сто в строке, где отображаются соответствующие аргументы (в данном случае — зна чения 28 и 29). Кроме того, обратите внимание на то, что дополнительные значения разделяются запятой, а не знаком +.
Ниже приведен видоизмененный вариант предыдущего оператора, в котором ука зывается ширина полей. Console.WriteLine("В феврале {0,10} или {1,5} дней.", 28, 29);
Выполнение этого оператора дает следующий результат. В феврале 28 или 29 дней.
Как видите, неиспользуемые части полей заполнены пробелами. Напомним, что минимальная ширина поля определяется параметром width. Если требуется, она мо жет быть превышена при выводе результата.
Разумеется, аргументы, связанные с командой форматирования, не обязательно должны быть константами. Ниже приведен пример программы, которая выводит та блицу результатов возведения чисел в квадрат и куб. В ней команды форматирования используются для вывода соответствующих значений. // Применить команды форматирования. using System; class DisplayOptions { static void Main { int i; Console.WriteLine("Число\tКвадрат\tКуб"); for(i = 1; i < 10; i++) Console.WriteLine("{0}\t{1}\t{2}", i, i*i, i*i*i); } }
Результат выполнения этой программы выглядит следующим образом. Число Квадрат Куб 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729
В приведенных выше примерах сами выводимые значения не форматировались. Но ведь основное назначение спецификаторов формата — управлять внешним видом выводимых данных. Чаще всего форматированию подлежат следующие типы данных: с плавающей точкой и десятичный. Самый простой способ указать формат данных — описать шаблон, который будет использоваться в методе WriteLine. Для этого ука зывается образец требуемого формата с помощью символов #, обозначающих разряды чисел. Кроме того, можно указать десятичную точку и запятые, разделяющие цифры. Ниже приведен пример более подходящего вывода результата деления 10 на 3. Console.WriteLine("Деление 10/3 дает: (0:#.##)", 10.0/3.0);
Выполнение этого оператора приводит к следующему результату. Деление 10/3 дает: 3.33
В данном примере шаблон #.## указывает методу WriteLine отобразить два десятичных разряда в дробной части числа. Следует, однако, иметь в виду, что метод WriteLine может отобразить столько цифр слева от десятичной точки, сколько по требуется для правильной интерпретации выводимого значения.
Рассмотрим еще один пример. Оператор Console.WriteLine("{0:###,###.##}", 123456.56);
дает следующий результат. 123,456.56
Для вывода денежных сумм, например, рекомендуется использовать спецификатор формата С. decimal balance; balance = 12323.09m; Console.WriteLine("Текущий баланс равен {0:С}" , balance);
Результат выполнения этого фрагмента кода выводится в формате денежных сумм, указываемых в долларах США. Текущий баланс равен $12,323.09
Форматом С можно также воспользоваться, чтобы представить в более подходя щем виде результат выполнения рассматривавшейся ранее программы расчета цены со скидкой. // Использовать спецификатор формата С для вывода // результата в местной валюте. using System; class UseDecimal { static void Main { decimal price; decimal discount; decimal discounted_price; // рассчитать цену со скидкой, price = 19.95m; discount = 0.15m; // норма скидки составляет 15% discounted_price = price - ( price * discount); Console.WriteLine("Цена со скидкой: {0:С}", discounted_price); } }
Вот как теперь выглядит результат выполнения этой программы. Цена со скидкой: 16,96 грн. Литералы
В C# литералами называются постоянные значения, представленные в удобной для восприятия форме. Например, число 100 является литералом. Сами литералы и их назначение настолько понятны, что они применялись во всех предыдущих примерах программ без всяких пояснений. Но теперь настало время дать им формальное объяс нение.
В С# литералы могут быть любого простого типа. Представление каждого литерала зависит от конкретного типа. Как пояснялось ранее, символьные литералы заключают ся в одинарные кавычки. Например, 'а' и '%' являются символьными литералами. Целочисленные литералы указываются в виде чисел без дробной части. Например, 10 и -100 — это целочисленные литералы. Для обозначения литералов с плавающей точкой требуется указывать десятичную точку и дробную часть числа. Например, 11.123 — это литерал с плавающей точкой. Для вещественных чисел с плавающей точкой в C# допускается также использовать экспоненциальное представление. У литералов должен быть также конкретный тип, поскольку C# является строго ти пизированным языком. В этой связи возникает естественный вопрос: к какому типу следует отнести числовой литерал, например 2,123987 или 0.23? К счастью, для от вета на этот вопрос в C# установлен ряд простых для соблюдения правил. Во-первых, у целочисленных литералов должен быть самый мелкий целочислен ный тип, которым они могут быть представлены, начиная с типа int. Таким образом, у целочисленных литералов может быть один из следующих типов: int, uint, long или ulong в зависимости от значения литерала. И во-вторых, литералы с плавающей точкой относятся к типу double.
Если вас не устраивает используемый по умолчанию тип литерала, вы можете явно указать другой его тип с помощью суффикса. Так, для указания типа long к литералу присоединяется суффикс l или L. Например, 12 — это литерал типа int, a 12L — ли терал типа long. Для указания целочисленного типа без знака к литералу присоединя ется суффикс u или U. Следовательно, 100 — это литерал типа int, a 100U — литерал типа uint. А для указания длинного целочисленного типа без знака к литералу при соединяется суффикс ul или UL. Например, 984375UL — это литерал типа ulong. Кроме того, для указания типа float к литералу присоединяется суффикс F или f. Например, 10.19F — это литерал типа float. Можете даже указать тип double, при соединив к литералу суффикс d или D, хотя это излишне. Ведь, как упоминалось выше, по умолчанию литералы с плавающей точкой относятся к типу double.
И наконец, для указания типа decimal к литералу присоединяется суффикс m или М. Например, 9.95М — это десятичный литерал типа decimal.
Несмотря на то что целочисленные литералы образуют по умолчанию значения типа int, uint, long или ulong, их можно присваивать переменным типа byte, sbyte, short или ushort, при условии, что присваиваемое значение может быть представлено целевым типом. Шестнадцатеричные литералы
Вам, вероятно, известно, что в программировании иногда оказывается проще поль зоваться системой счисления по основанию 16, чем по основанию 10. Система счисле ния по основанию 16 называется шестнадцатеричной. В ней используются числа от 0 до 9, а также буквы от А до F, которыми обозначаются десятичные числа 10, 11, 12, 13, 14 и 15. Например, десятичному числу 16 соответствует шестнадцатеричное число 10. Вследствие того что шестнадцатеричные числа применяются в программировании до вольно часто, в C# разрешается указывать целочисленные литералы в шестнадцате ричном формате. Шестнадцатеричные литералы должны начинаться с символов 0х, т.е. нуля и последующей латинской буквы "икс". Ниже приведены некоторые приме ры шестнадцатеричных литералов. count = 0xFF; // 255 в десятичной системе incr = 0x1а; // 26 в десятичной системе Управляющие последовательности символов