Иллюстрированный самоучитель по VB .NET
Форматирование данных
Все функции
форматирования возвращают новую
строку в заданном формате. В 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
|
Возвращает
тангенс заданного угла
|