Форматирование данных
Все функции
форматирования возвращают новую
строку в заданном формате. В VB .NET
сохранены аналоги старых функций
форматирования из VB6 и VBScript, поэтому
вы можете продолжать использовать
функции Format, Format Number, For-matCurrency,
FormatPercent и FormatDateTime. Последние четыре
функции неплохо справляются с
простым форматированием, но мы все
равно предпочитаем использовать
более мощные средства
форматирования, реализованные в .NET
Framework.
Синтаксис
форматирования в .NET Framework на первый
взгляд выглядит несколько странно.
Рассмотрим несложный пример:
Dim balance As
Decimal = 123456
Dim creditLimit As
Decimal = 999999
Console.WriteLine("Customer
balance is {0:C}, credit limit is {1:C} ",_
balance. creditLimit
= balance)
Результат:
Customer balance is
$123,456.00. credit limit is $876.543.00
Попробуйте
привести фрагмент, выделенный
жирным шрифтом, к следующему виду:
Console.WriteLine("Customer credit is {1:C}, balance is {0:C} ".
balance. creditLimit
= balance)
Вы получите
следующий результат:
Customer credit is $876.543.00.
balance is $123.456.00
Форматируемые
переменные перечисляются в порядке
их следования в списке. Так, во
втором примере {1:С} означает вторую
переменную в списке, а {0:С}
соответствует первой переменной (напомним,
что индексация в .NET Framework
начинается с 0). «С» означает
форматирование в денежном формате,
определенном в параметрах
локального контекста Windows.
В табл. 3.7
приведены условные обозначения
шести базовых математических
операций.
Результат
стандартного деления (/) всегда
относится к типу Double, даже в случае
де-ления без остатка. Результат
целочисленного деления (\) всегда
относится к типу Integer. Это означает,
что при работе с типами Decimal и Integer
вам придется часто использовать
функции преобразования.
Таблица 3.7. Математические
операции
Оператор |
Операция |
+ | Сложение |
- | Вычитание (и обозначение отрицательных чисел) |
/ | Деление (преобразование к Double — не может вызвать исключение DivideByZero; см. главу 7) |
\ | Целочисленное деление (без преобразования — может вызвать исключение DivideByZero) |
* | Умножение |
^ | Возведение в степень |
Чтобы лучше
разобраться в разных типах деления,
можно воспользоваться методом .NET
GetType. В командах вывода (таких как
WriteLine) этот метод возвращает имя
типа в строковом представлении.
Рассмотрим следующую программу:
Module Modulel
Sub Main()
Console.WriteLine((4
/ 2).GetType())
Console. ReadLine()
End Sub
End Module
В консольном
окне выводится строка
System.Double
Возможности
метода GetType не ограничиваются
простым выводом имени — в
частности, он используется в
процессе рефлексии. Механизм
рефлексии описан в главе 4.
Ниже приведен
пример ситуации, в которой
необходимо учитывать тип значения,
возвращаемого оператором деления.
Перед нами простая (но нерабочая)
версия программы, преобразующей
температуру по Цельсию в
температуру по Фаренгейту. В
выделенной строке отсутствует
суффикс @, преобразующий результат
деления к типу Decimal:
Option Strict On
Module Modulel Sub
Main()
Dim cdeg As Decimal
Console.. Writer
Enter the degrees in centigrade...")
cdeg=CDec(Console.ReadLine())
Dim fdeg As Decimal
fdeg = (((9 / 5) *
cdeg) + 32)
Console.WriteLine(cdeg
& " is " & fdeg & " degrees Fahrenheit.")
Console. ReadLine()
End Sub
End Module
Из-за
присутствия знака / в выделенной
строке переменной fdeg присваивается
результат типа Double. В режиме
жесткой проверки типов это
приводит к тому, что на стадии
компиляции будет выдано следующее
сообщение об ошибке:
Option Strict
disallows implicit conversions from Double to Decimal.
Как исправить ошибку? Только не надо убирать команду Option Strict — это одно из лучших новшеств VB .NET, которое избавляет вас от злостного искажения типов. Лучше воспользуйтесь суффиксом @ или преобразуйте выражение (полностью или частично) к типу Decimal. Пример:
fdeg = ((CDec(9 / 5)
* cdeg) + 32)
Поскольку
результат деления преобразуется к
типу Decimal, результат тоже относится
к типу Decimal.
Остается лишь
заметить, что в этом простом
примере мы используем метод Write
вместо Wri teLi ne, чтобы предотвратить
перевод строки после вывода текста.
Кроме того, в реальной программе
введенные данные следовало бы
предварительно проанализировать,
потому что пользователи часто
ошибаются при вводе.
Наконец,
вещественное деление в VB .NET
соответствует стандарту IEEE,
поэтому вместо ошибки деления на
ноль теперь происходит нечто
странное. Пример:
Sub Main()
Dim getData As
String
Dim x, у As Double
x = 4
У = 0
Console.WriteLine("What
is 4/0 in VB .NET? " & x / y)
Console.ReadLine()
End Sub
Результат
выглядит так:
What is 4/0 in VB.
NET? Infinity
Результат деления 0/0 равен
NaN (Not A Number,
«не является числом»).
В табл. 3.8
перечислены операторы,
используемые только при делении
чисел типа Integer и Long.
Таблица 3.8. Математические
операторы целочисленного деления
Оператор |
Операция |
\ |
Целочисленное
деление любых целых чисел |
Mod |
Остаток от
целочисленного деления |
Оператор \
игнорирует остаток от деления и
возвращает результат типа Integer (если
он относится к интервалу
допустимых значений этого типа).
Например, 7\3=21. Напомним, что
оператор / дает результат типа Double;
если вы хотите, чтобы частное
относилось к типу Integer —
воспользуйтесь оператором \ или
функцией преобразования типа.
Оператор Mod
дополняет оператор целочисленного
деления и возвращает остаток от
целочисленного деления. Например, 7
Mod 3 = 1. Если целые числа делятся без
остатка, оператор Mod возвращает 0: 8
Mod 4 = 0.
Круглые скобки и приоритет операций
При обработке
сложных выражений
последовательность выполнения
операций задается двумя способами.
При использовании круглых Скобок
вам не придется запоминать
приоритеты различных операций. В VB .NET,
как и во многих языках
программирования, операции
обладают приоритетом, определяющим
последовательность их выполнения.
Умножение обладает более высоким
приоритетом, чем сложение;
следовательно, выражение 3+4*5 равно
23, поскольку умножение (4*5)
выполняется раньше, чем сложение.
Ниже
перечислены математические
операции в порядке убывания
приоритета.
- Возведение
в степень (^).
- Унарный
минус (изменение знака числа).
- Умножение
и деление.
- Целочисленное
деление.
- Вычисление
остатка (Mod).
- Сложение
и вычитание.
Если две
операции обладают одинаковым
приоритетом, порядок выполнения
определяется порядком их
следования в выражении (слева
направо).
Сокращенная
запись операций с присваиванием
Для некоторых
операций, объединенных с
присваиванием, в VB. NET предусмотрены
сокращенные обозначения,
перечисленные в следующей таблице.
Сокращенная
запись |
Эквивалент |
А*=В |
А = А*В |
А+=В |
А = А + В |
А/=В |
А = А/В |
А-=В |
А = А-В |
А\=В |
А = А\В |
А^=В |
А = А^В |
А&=В |
А = А & В (конкатенация
строк) |
Математические функции и математические константы
Встроенные
математические функции VB6 работают
и в VB .NET, но мы предпочитаем
использовать методы класса Math,
входящего в .NET Framework. В этот класс
также входят некоторые полезные
константы (например, Math. PI и Math. Е).
Основные математические функции
класса Math перечислены в табл. 3.9. Все
эти функции объявлены общими (shared),
поэтому они принадлежат классу Math в
целом, а не его отдельным
экземплярам (которые, впрочем, все
равно невозможно создать — см.
главу 4).
Все
перечисленные методы являются
общими методами класса Math, поэтому
они должны вызываться с префиксом
Math — например, Math.Log10(l0).
В VB .NET
предусмотрена целая группа методов
для получения разнообразных случай-ных
чисел. Мы рассмотрим эти методы в
главе 4, когда речь пойдет о
создании объектов.
Таблица 3.9. Общие
математические функции класса Math
Математическая
функция |
Описание |
Abs |
Возвращает
абсолютное значение (модуль)
числа |
Acos |
Возвращает
угол, косинус которого равен
заданному числу |
Asin |
Возвращает
угол, синус которого равен
заданному числу |
Atan |
Возвращает
угол, тангенс которого равен
заданному числу |
Ceiling |
Возвращает наименьшее целое число, большее либо равное заданному числу |
Cos |
Возвращает
косинус заданного угла |
Exp | Возвращает число е (приблизительно 2,71828182845905), возведенное в заданную степень |
Floor | Возвращает наибольшее целое число, большее либо равное заданному числу |
Log |
Возвращает
натуральный логарифм |
Log10 |
Возвращает
десятичный логарифм |
Max |
Возвращает
большее из двух заданных чисел |
Min |
Возвращает
меньшее из двух заданных чисел |
Round |
Возвращает
целое число, ближайшее к
заданному числу |
Sign |
Возвращает
величину, определяющую знак
числа |
- Sin |
Возвращает
синус заданного угла |
Sqrt |
Возвращает
квадратный корень |
Tan |
Возвращает
тангенс заданного угла |