Числа
Преобразования типов
Нередко возникают ситуации, когда нужно преобразовать один тип данных в другой. Например, целое число в вещественное или в строку, и обратно.
Целое число можно сразу же присвоить вещественному - преобразование произойдет автоматически. Например,
var
r: real;
begin
r:= 3; //результат: 3.0
…
Если есть желание, вы можете поступить так же, как в прошлых лекциях: создать новый проект с одной кнопкой, сгенерировать для кнопки событие нажатия, и все примеры пробовать в этом событии. Раздел переменных и начало события begin указаны, не забудьте в конце события оставить end;
Вещественное число присвоить целой переменной нельзя - компилятор выдаст ошибку. В этом случае мы можем поступить двумя способами: либо просто отбросить дробную часть, либо округлить вещественное число до ближайшего целого. Математическая функция Trunc() отсекает дробную часть, и возвращает целое число:
var
i: integer;
begin
i:= Trunc(3.65); //результат = 3
…
Математическая функция Round() округляет вещественное число до ближайшего целого:
var
i: integer;
begin
i:= Round(3.65); //результат = 4
…
Если целое число требуется преобразовать в строку, используют функцию IntToStr(), нам уже приходилось это делать. В скобках указывают целое число любого целочисленного типа, а функция возвращает это же число в виде строки. Пример:
var
i: integer;
s: string;
begin
i:= 10;
s:= IntToStr(i); //теперь в s строка '10'
ShowMessage(s); //содержимое s можно вывести на экран
…
Для обратного преобразования используют функцию StrToInt(), программист должен следить, чтобы в эту функцию попадало действительно целое число в виде строки. Пример:
var
i: integer;
s: string;
begin
s:= '35'; //загрузили число в виде строки
i:= StrToInt(s); //преобразовали строку '35' в число 35
i:= i * 2; //теперь здесь 70
s:= IntToStr(i); //получили строку '70'
ShowMessage(s); //содержимое s выводим на экран
…
Если строку требуется преобразовать в вещественное число, используют функцию StrToFloat():
var
r: real;
s: string;
begin
s:= '3,14';
r:= StrToFloat(s);
Обратите внимание - здесь в строковую переменную мы внесли вещественное число в виде строки. При этом десятичную часть мы разделили не точкой, а запятой: "3,14". Так положено вносить числа в операционной системе, если установлена русская версия Windows. В английской версии разделителем является точка. Данная настройка зависит от глобальной переменной DecimalSeparator. Переменную объявлять не нужно - она уже объявлена, и содержит символ системного разделителя дробной части.
Для преобразования вещественного числа в строку можно использовать две функции. Проще всего воспользоваться функцией FloatToStr():
var
r: real;
s: string;
begin
r:= 3.14; //здесь мы вводим число, а не строку, поэтому разделитель - точка
s:= FloatToStr(r); //теперь в s строка '3,14'
ShowMessage(s);
Если мы попытаемся ввести в вещественную переменную r число, используя в качестве разделителя запятую, то произойдет ошибка. Числа нужно разделять точкой, а числа в виде строки - запятой (в русской Windows).
Но лучше всего для преобразования числа в строку использовать функцию FormatFloat(). Эта функция не только преобразует вещественное число в строку, но и выводит его в нужном формате. Желаемый формат задается маской - строкой со специальными символами. Синтаксис функции:
FormatFloat(Формат, Значение);
Формат - это строка с маской, Значение - исходное вещественное число. Функция возвращает в качестве результата указанное вещественное число в виде строки, отформатированной согласно маске.
| Символ | Описание |
|---|---|
| 0 | В данную позицию записывается цифра. Если в исходном числе в данной позиции была цифра - записывается она. Иначе будет записан '0'. |
| # | В данную позицию записывается цифра. Если в исходном числе в данной позиции была цифра - записывается она. Иначе в данную позицию ничего не записывается. |
| . | Данный символ, встречающийся в маске первый раз, определяет расположение десятичного разделителя. Любой последующий символ '.' игнорируется. Символ, который будет использован в качестве десятичного разделителя в результирующей строке, хранится в глобальной переменной DecimalSeparator. |
| , | Если маска содержит данный символ, то в отформатированной строке, между каждой группой из трех цифр слева от десятичной точки, будут вставлены разделители тысяч. Положение и количество символов ',' в маске на результат не влияет. Символ, который будет использован в качестве разделителя тысяч, определяется глобальной переменной ThousandSeparator. |
| E+ | Экспоненциальный формат. Если любая из строк: 'E+', 'E-', 'e+', 'e-', содержится в строке формата, то результирующее значение будет представлено в экспоненциальном виде. За одной из этих строк могут следовать символы '0', определяющие минимальное число цифр в экспоненте. |
| ; | Отделяет в маске варианты форматирования для положительного, отрицательного и нулевого значения. |
Пример:
var
r: real;
s: string;
begin
r:= 123.789;
s:= FormatFloat('#.##', r);
ShowMessage(s); //результат - '123,79' - дробная часть округлена
r:= 789.123;
s:= FormatFloat('#.##', r);
ShowMessage(s); //результат - '789,12'
Для денежных расчетов можно применить маску '#.00' - это гарантирует две цифры после запятой. Если цифр нет, будут выведены нули, например
123,00